【发布时间】:2015-01-27 17:13:34
【问题描述】:
我有一个类似的查询
SELECT
`campaign_question_options`.`text`,
COUNT(`campaign_submission_answers`.`answer`) as `count`
FROM `campaign_questions`
INNER JOIN `campaign_question_options` ON `campaign_question_options`.`campaign_question_id` = `campaign_questions`.`id`
LEFT JOIN `campaign_submission_answers` ON `campaign_submission_answers`.`answer` = `campaign_question_options`.`text` AND `campaign_submission_answers`.`campaign_question_id` = 1
LEFT JOIN `campaign_submissions` ON `campaign_submissions`.`id` = `campaign_submission_answers`.`campaign_submission_id`
LEFT JOIN `participants` ON `participants`.`id` = `campaign_submissions`.`participant_id`
WHERE
`campaign_questions`.`id` = 1
GROUP BY `campaign_submission_answers`.`answer`
ORDER BY `campaign_question_options`.`index`;
这给了我一个类似的结果集
+--------------+-------+
| text | count |
+--------------+-------+
| 1 (positive) | 114 |
| 2 | 48 |
| 3 (neutral) | 34 |
| 4 | 6 |
| 5 (negative) | 0 |
+--------------+-------+
所以问题是我需要在participants.appraisee_id 列上进一步过滤结果。但是,如果我将其添加到 where 子句中,我将丢失零结果(因为左连接返回空行)。
SELECT
`campaign_question_options`.`text`,
COUNT(`campaign_submission_answers`.`answer`) as `count`
FROM `campaign_questions`
INNER JOIN `campaign_question_options` ON `campaign_question_options`.`campaign_question_id` = `campaign_questions`.`id`
LEFT JOIN `campaign_submission_answers` ON `campaign_submission_answers`.`answer` = `campaign_question_options`.`text` AND `campaign_submission_answers`.`campaign_question_id` = 1
LEFT JOIN `campaign_submissions` ON `campaign_submissions`.`id` = `campaign_submission_answers`.`campaign_submission_id`
LEFT JOIN `participants` ON `participants`.`id` = `campaign_submissions`.`participant_id`
WHERE
`campaign_questions`.`id` = 1 AND `participants`.`appraisee_id` = 1
GROUP BY `campaign_submission_answers`.`answer`
ORDER BY `campaign_question_options`.`index`;
返回
+--------------+-------+
| text | count |
+--------------+-------+
| 1 (positive) | 16 |
| 2 | 1 |
+--------------+-------+
其实我想要的时候
+--------------+-------+
| text | count |
+--------------+-------+
| 1 (positive) | 16 |
| 2 | 1 |
| 3 (neutral) | 0 |
| 4 | 0 |
| 5 (negative) | 0 |
+--------------+-------+
谁能帮我改进这个查询?
谢谢
更新
我已经创建了该结构的数据库转储,如果有任何人希望继续帮助我,这可能会很有用。 https://gist.github.com/simonbowen/a8316fe91c78b8464402
【问题讨论】:
-
很高兴您向我们展示了您的尝试,但如果是我,我会从正确的 DDL(和/或 sqlfiddle)开始,并获得所需的结果
-
@Strawberry 你是对的,但是它不允许我加载数据(8000 个字符限制)。这是结构sqlfiddle.com/#!2/0f7e5
-
我们不需要看到整个事情。足以具有代表性。
-
@Strawberry 好的,我已经提供了结构的小提琴,并且还在评论更新中提供了转储。我在问题的末尾概述了我的预期结果。
标签: mysql sql join count group-by