Myślę, że to powinno wystarczyć:
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
Pierwsze JOIN
filtruje do odpowiedzi na to samo pytanie, co zaakceptowana odpowiedź.
Drugie JOIN
znajdzie to pytanie.
WHERE
klauzula ograniczy aktualizację tylko do pytań z podanym autorem i określa akceptowany identyfikator odpowiedzi.
Dla dodatkowego warunku dodaj
AND (ques.free IS NULL or ans1.accepted IS NULL)
do WHERE
klauzula. ques.free IS NULL
pasuje do dowolnego bezpłatnego pytania, a ans1.accepted IS NULL
dopasowuje pytanie bez zaakceptowanej odpowiedzi (ponieważ gdy odpowiedź jest akceptowana, wszystkie inne odpowiedzi na to pytanie są accepted = 0
).
DEMO pytania bez zaakceptowanej odpowiedzi
DEMO pytania, które jest bezpłatne