Ik denk dat dit het zou moeten doen:
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
De eerste JOIN filtert naar de antwoorden op dezelfde vraag als het antwoord dat wordt geaccepteerd.
De tweede JOIN vindt die vraag.
De WHERE clausule beperkt de update alleen tot vragen met de opgegeven auteur en specificeert de antwoord-ID die wordt geaccepteerd.
Voeg voor de aanvullende voorwaarde
. toeAND (ques.free IS NULL or ans1.accepted IS NULL)
naar de WHERE clausule. ques.free IS NULL komt overeen met elke gratis vraag, en ans1.accepted IS NULL komt overeen met een vraag zonder geaccepteerd antwoord (omdat wanneer een antwoord wordt geaccepteerd, alle andere antwoorden op die vraag accepted = 0 worden ).
DEMO van vraag zonder geaccepteerd antwoord
DEMO van vragen die gratis is