Подсчет значений в таблице объединен несколько раз - PullRequest
2 голосов
/ 29 сентября 2011

У меня проблема с подсчетом таблицы, к которой присоединяются несколько раз.

Таблица question:

+----+----------+
| id | question |
+----+----------+
|  1 | Foo?     |
+----+----------+

Таблица answer:

+----+-------------+--------+
| id | question_id | choice |
+----+-------------+--------+
|  1 |           1 |      1 |
|  2 |           1 |      1 |
|  3 |           1 |      1 |
|  4 |           1 |      2 |
|  5 |           1 |      3 |
|  6 |           1 |      3 |
+----+-------------+--------+

Ожидаемый результат:

+----------+-------+-------+-------+
| question | num_1 | num_2 | num_3 |
+----------+-------+-------+-------+
| Foo?     |     3 |     1 |     2 |
+----------+-------+-------+-------+

(Неудачный) запрос и его результат:

SELECT
    q.question AS question,
    COUNT(a1.id) AS num_1,
    COUNT(a2.id) AS num_2,
    COUNT(a3.id) AS num_3
FROM
    question q
    LEFT JOIN answer a1 ON a1.question_id = q.id AND a1.choice = 1
    LEFT JOIN answer a2 ON a2.question_id = q.id AND a2.choice = 2
    LEFT JOIN answer a3 ON a3.question_id = q.id AND a3.choice = 3
GROUP BY
        q.id

+----------+-------+-------+-------+
| question | num_1 | num_2 | num_3 |
+----------+-------+-------+-------+
| Foo?     |     6 |     6 |     6 |
+----------+-------+-------+-------+

Я не понимаю, почему я получаю этот результат.Вы можете мне помочь?

Ответы [ 2 ]

3 голосов
/ 29 сентября 2011

Поскольку choice = 1 дает 3 строки, choice = 2 дает 1 строку, choice = 3 дает 2 строки и 1 * 2 * 3 = 6.если вы удалите group by и агрегаты и посмотрите на результаты, это должно быть ясно.Вы можете использовать

SELECT
    q.question AS question,
    COUNT(CASE WHEN a.choice = 1 THEN 1 END) AS num_1,
    COUNT(CASE WHEN a.choice = 2 THEN 1 END) AS num_2,
    COUNT(CASE WHEN a.choice = 3 THEN 1 END) AS num_3
FROM
    question q
    LEFT JOIN answer a ON a.question_id = q.id AND a.choice IN (1,2,3)
GROUP BY
        q.id,
        q.question
1 голос
/ 29 сентября 2011

Если вы выполните свой запрос без подсчета и группировки, вы увидите, что вы получите следующие результаты:

+------+------+------+------+
| q    | num1 | num2 | num3 |
+------+------+------+------+
| foo  |    1 |    4 |    5 |
| foo  |    1 |    4 |    6 |
| foo  |    2 |    4 |    5 |
| foo  |    2 |    4 |    6 |
| foo  |    3 |    4 |    5 |
| foo  |    3 |    4 |    6 |
+------+------+------+------+

Как и ожидалось, 6 строк, поэтому каждое поле с псевдонимом даст вам счет 6У Мартина Смита правильный ответ выше.

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