Мисля, че това трябва да стане:
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
).
ДЕМО на въпрос без приет отговор
ДЕМО на въпрос, което е безплатно