Мисля, че това трябва да стане:
UPDATE QandA AS ans1
JOIN QandA AS ans2 ON ans2.related = ans1.related
JOIN QandA AS ques ON ans2.related = ques.id
SET ans1.accepted = (ans1.id = :answer_id)
WHERE ques.author_id = :session_id
AND ans2.id = :answer_id
Първият JOIN филтрира до отговорите на същия въпрос като отговора, който се приема.
Вторият JOIN намира този въпрос.
WHERE клаузата ще ограничи актуализацията само до въпроси с даден автор и посочва идентификатора на отговора, който се приема.
За допълнителното условие добавете
AND (ques.free IS NULL or ans1.accepted IS NULL)
до WHERE клауза. ques.free IS NULL съответства на всеки безплатен въпрос и ans1.accepted IS NULL съответства на въпрос без приет отговор (защото когато отговорът е приет, всички останали отговори на този въпрос получават accepted = 0 ).
ДЕМО на въпрос без приет отговор
ДЕМО на въпрос, което е безплатно