Eu acho que isso deve fazer isso:
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
O primeiro
JOIN
filtra até as respostas para a mesma pergunta que a resposta que está sendo aceita. O segundo
JOIN
encontra essa pergunta. O
WHERE
A cláusula restringirá a atualização apenas a perguntas com o autor fornecido e especifica o ID de resposta que está sendo aceito. DEMO
Para a condição adicional, adicione
AND (ques.free IS NULL or ans1.accepted IS NULL)
para
WHERE
cláusula. ques.free IS NULL
corresponde a qualquer pergunta gratuita e ans1.accepted IS NULL
corresponde a uma pergunta sem resposta aceita (porque quando uma resposta é aceita, todas as outras respostas a essa pergunta são accepted = 0
). DEMO de pergunta sem resposta aceita
DEMO da pergunta que é grátis