QuestionsTable
id * (int) | question_text (строка) | question_type (int)
AlternativesTable
id * (int) | question_id (int) | altern_text (строка) | is_correct (bool)
AnswersTable
id * (int) | question_id (int) | alternative_id (int) | answer_text (строка)
"*" = первичный ключ
Каждый вопрос может быть либо типа свободного текста, либо множественного селектора. Вопрос с несколькими селекторами имеет одну или несколько альтернатив, и только один может быть правильным.
Ответ задается с помощью question_id и altern_id (множественный селектор) или answer_text (бесплатный текст). Это is_correct bool, поэтому я могу отметить, какой ответ правильный.
Как создать SQL-запрос, который даст мне все альтернативы, перечисленные для каждого вопроса, с подсчетом по каждой альтернативе, которая показывает, сколько ее выбрало? Скажем, я могу сохранить его в массиве и перебрать его с помощью цикла foreach и показать его в качестве примера ниже.
В качестве примера каждый вопрос представлен им question_text, и каждый альтернативный вариант этого вопроса представлен Alt1 (альтернативный_текст), Alt2 и т.д. Число после альтернатив - это количество полученных им выборов ( ответы).
Alt1 | 3
Alt2 | 2
Alt3 | 0
Alt1 | 2
Alt2 | 3
Ответ1
Ответ2
....
Я могу сделать запрос, который дает мне все вопросы и все альтернативы, принадлежащие ему, но я терплю неудачу, когда пытаюсь получить счет на все ответы для каждого альтернативного вопроса.
Итак, теперь я могу использовать некоторую помощь SQL-ninja =)
Заранее спасибо Daniel
Сверху моей головы это может работать:
SELECT alternatives.id, COUNT(DISTINCT(answers.id))
FROM alternatives
LEFT JOIN answers ON alternatives.id = answers.altid
GROUP BY alternatives.id;
Это должно дать вам общее количество раз, когда каждая альтернатива встречается в таблице answers
.
DISTINCT
не нужен. Вы можете просто использовать COUNT(answers.id)
в SELECT
. Не уверен, что я думал там ...