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