Je pense que ça devrait le faire :
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
Le premier JOIN
filtre les réponses à la même question que la réponse acceptée.
Le deuxième JOIN
trouve cette question.
Le WHERE
limitera la mise à jour uniquement aux questions avec l'auteur donné et spécifiera l'ID de réponse accepté.
Pour la condition supplémentaire, ajoutez
AND (ques.free IS NULL or ans1.accepted IS NULL)
au WHERE
clause. ques.free IS NULL
correspond à n'importe quelle question libre, et ans1.accepted IS NULL
correspond à une question sans réponse acceptée (car lorsqu'une réponse est acceptée, toutes les autres réponses à cette question obtiennent accepted = 0
).
DEMO de question sans réponse acceptée
DEMO de question gratuite