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