Вы делаете соединения в неправильном направлении - сначала вы смотрите на опции , даже если вы специально заявили, что хотите, чтобы все было сведено в таблицу с помощью question . Это означает, что вы получаете результаты для всех вариантов, независимо от того, относятся ли они даже к вашему вопросу ...
О, и я предполагаю, что answer_id
сопоставлен с question_id
, иначе вы не сможете получить каких-либо значимых результатов (то есть ответы иначе не будут сопоставлены с вопросами. ..)
Попробуйте вместо этого запрос:
SELECT b.id, b.text, b.default, (SELECT IFNULL(
ROUND((COUNT(c.id) * 100) /
(SELECT COUNT(d.id)
FROM answers as d
WHERE d.answer_id = a.question_id)
, 2)
, 0)
FROM answers as c
WHERE c.answer_id = a.question_id
AND c.option_id = a.option_id) as percentage
FROM questions_options as a
JOIN options as b
ON b.id = a.option_id
WHERE a.question_id = QUESTION_ID
ORDER BY percentage DESC, a.option_id ASC
Обратите внимание, что у меня нет копии MySQL для ее запуска, и я обычно использую CTE (которые, как мне сообщили, не поддерживаются для MySQL).
<ч />
РЕДАКТИРОВАТЬ:
В свете того факта, что параметры по умолчанию могут не отображаться в таблице questions_options
, попробуйте следующее:
SELECT a.id, a.text, a.default, IFNULL(
ROUND((b.answerCount * 100) /
(SELECT COUNT(c.id)
FROM answers as c
WHERE c.answer_id = QUESTION_ID)
, 2)
, 0)
FROM options as a
LEFT JOIN (SELECT c.option_id, count(c.id) as answerCount
FROM answers as c
WHERE c.question_id = QUESTION_ID
GROUP BY c.option_id) as b
ON b.option_id = a.id
Обратите внимание, что вы по-прежнему будете получать «бессмысленные» результаты «0» для каждого ответа «по умолчанию», который был не представлен респондентам опроса - и нет способа отличить их от любых фактических «0» результатов для ответов «по умолчанию», которые были представлены респондентам. Скорее всего, вам будет далеко лучше размещать так называемые параметры "по умолчанию" в таблице questions_options
- так как у вас нет возможности определить все параметры, которые были представили респондентам (какие из них у вас есть ответы, а какие совсем другие); это может быть огромной проблемой для вашей компании. Кроме того, некоторые параметры «по умолчанию» могут не иметь смысла в контексте: «Предпочитаете ли вы чай горячим или холодным», «Да».