Penso che questo dovrebbe farlo:
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
Il primo JOIN
filtra fino alle risposte alla stessa domanda della risposta accettata.
Il secondo JOIN
trova quella domanda.
Il WHERE
la clausola limiterà l'aggiornamento solo alle domande con l'autore specificato e specifica l'ID risposta da accettare.
Per la condizione aggiuntiva, aggiungi
AND (ques.free IS NULL or ans1.accepted IS NULL)
al WHERE
clausola. ques.free IS NULL
corrisponde a qualsiasi domanda libera e ans1.accepted IS NULL
corrisponde a una domanda senza risposta accettata (perché quando una risposta viene accettata, tutte le altre risposte a quella domanda ottengono accepted = 0
).
DEMO della domanda senza risposta accettata
DEMO della domanda gratuita