Myslím, že by to mělo stačit:
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
První JOIN
filtruje dolů na odpovědi na stejnou otázku jako přijímaná odpověď.
Druhý JOIN
najde tuto otázku.
WHERE
klauzule omezí aktualizaci pouze na otázky s daným autorem a specifikuje přijímané ID odpovědi.
Pro další podmínku přidejte
AND (ques.free IS NULL or ans1.accepted IS NULL)
do WHERE
doložka. ques.free IS NULL
odpovídá libovolné volné otázce a ans1.accepted IS NULL
odpovídá otázce bez přijaté odpovědi (protože když je odpověď přijata, všechny ostatní odpovědi na tuto otázku budou accepted = 0
).
DEMO na otázku bez přijaté odpovědi
DEMO otázky, která je zdarma