Mysql JOIN рассчитывает - PullRequest
       14

Mysql JOIN рассчитывает

0 голосов
/ 31 марта 2010

У меня есть 2 таблицы MySQL:

Question with the following columns : id, question, nranswers

Nranswers должен быть числом от 1 до 5

А другой столик

Answers with the following columns: questionid, userid, answer .

Теперь проблема в том, что я хочу получить ответы на каждый ответ на один вопрос (скажем, id 22).

P.S. Если nranswers равно 3, результат должен выглядеть следующим образом:

(правильное число означает, сколько раз был выбран номер ответа)

1 - 2

2 - 8

3 - 7

Если nranswers равно 5, результат должен выглядеть следующим образом:

1 - 3

2 - 8

3 - 14

4 - 19

5 - 8

Пожалуйста, помогите мне с запросом, ведь он не считает ответы, которые не были выбраны, только те, которые были выбраны хотя бы один раз.

Ответы [ 2 ]

3 голосов
/ 31 марта 2010

Я позволил себе добавить столбец question_id, который будет использоваться для объединения каждого ответа с вопросом.

Question with the following columns : id, question, nranswers
Answers with the following columns: question_id, userid, answer

Вот ваш запрос:

SELECT answer, COUNT(*) AS answer_count
FROM Answers
GROUP BY answer
WHERE question_id = 22
ORDER by answer

Однако, если nranswers равен 3, но никто не выбрал 3 в качестве ответа, он не будет показан. Этот запрос показывает только те ответы, которые были выбраны.

Edit:

Чтобы получить счетчик всех доступных ответов, а не только выбранных, самым простым способом (по запросу) было бы избавиться от столбца Question.nranswers и добавить таблицу QuestionAnswers:

QuestionAnswers with the following columns: question_id, answer

Данные в QuestionAnswers должны выглядеть так:

quesiton_id answer
-------------------
22          1
22          2
22          3

Итак, у вас есть все возможные ответы на каждый вопрос.

Тогда запрос будет следующим:

SELECT qa.answer, COUNT(a.question_id) AS answer_count
FROM QuestionAnswers qa
LEFT OUTER JOIN Answers a
  ON qa.question_id = a.question_id AND a.answer = qa.answer
GROUP BY qa.answer
WHERE qa.question_id = 22
ORDER by qa.answer
0 голосов
/ 31 марта 2010

Взяв один из ответов на на этот вопрос , похоже, вам нужна какая-то временная таблица для выбора диапазона чисел в MySQL. Похоже, этот ответ может очень хорошо масштабироваться.

Предположим, у вас есть максимум десять ответов на ваш вопрос. Затем вы можете сделать что-то вроде этого:

SELECT Choices.num,IF(Answers.answer IS NULL,0,COUNT(*))
FROM 
    (SELECT choice.num,Question.*
        FROM
           (SELECT 1 num
            UNION ALL
            SELECT 2 num
            UNION ALL
            SELECT 3 num
            UNION ALL
            SELECT 4 num
            UNION ALL
            SELECT 5 num
            UNION ALL
            SELECT 6 num
            UNION ALL
            SELECT 7 num
            UNION ALL
            SELECT 8 num
            UNION ALL
            SELECT 9 num
            UNION ALL
            SELECT 10 num) choice,
           Question
         WHERE Question.id=22
    ) Choices
    LEFT OUTER JOIN Answers 
       ON Answers.question_id=Choices.id AND Answers.answer=Choices.num
   WHERE Choices.num<=Choices.nranswers
   GROUP BY Choices.num;

Это грязно, но работает. Если вам нужно больше вариантов, вы можете сделать что-то похожее на то, что было сделано в ответе, упомянутом выше. Также замените WHERE Question.id=22 на нужный вам идентификатор. Никаких других изменений не требуется.

...