2017-10-18 56 views
0

如果我有表answers以下数据分组结果:MySQL的计数和基于2列

+-------------------------------------------+ 
| forum_id | user_id | question_id | answer | 
+-------------------------------------------+ 
| 1  | 1  | 1   | A  | 
| 1  | 1  | 2   | B  | 
| 1  | 2  | 1   | B  | 
| 1  | 2  | 2   | B  | 
| 1  | 3  | 1   | A  | 
| 1  | 3  | 2   | B  | 
| 2  | 1  | 1   | A  | 
| 2  | 2  | 2   | A  | 
+-------------------------------------------+ 

我将如何选择答案的理货?重演结果如:

+------------------------------+ 
| question_id | answer | count | 
+------------------------------+ 
| 1   | A  | 2  | 
| 1   | B  | 1  | 
| 2   | A  | 3  | 
| 2   | B  | 0  | 
+------------------------------+ 

这是我目前所拥有的。我知道它必须使用GROUP BY,但我正在努力返回预期的结果。

SELECT question_id, answer, COUNT(*) 
FROM answers 
WHERE forum_id = 1 
GROUP BY question_id, answer 
+2

请编辑您的问题,告诉我们您的预期答案和您从查询中获得的答案有什么区别。你的查询看起来不错。 –

+0

我认为您的预期输出是错误的,并且您当前的查询是正确的。 –

+0

@TimBiegeleisen操作要计算有多少用户没有回答B.在这种情况下,0 –

回答

0

试试这个:

SELECT t.question_id, t.answer, COUNT(DISTINCT user_id) 
FROM 
(
    SELECT DISTINCT a.question_id, t.answer 
    FROM answers as a, (SELECT 'A' AS answer UNION ALL SELECT 'B') AS t 
) AS t 
LEFT JOIN answers AS a ON a.question_id = t.question_id 
AND a.answer = t.answer and forum_id = 1 
GROUP BY t.question_id, t.answer; 

结果:

| question_id | answer | count | 
|-------------|--------|-------| 
|   1 |  A |  2 | 
|   1 |  B |  1 | 
|   2 |  A |  0 | 
|   2 |  B |  3 | 

需要注意的是:

在您的样本数据B中有3个问题2的条目,而A没有问题2的条目。而当然,所有论坛= 1,所以您的预期结果是不正确的,我认为我的是正确的。

+1

这是一个非常好的开始,但有一些问题。 ** 1)**'UNION'中的'(A,B)'的硬代码我希望OP在不同的表中有有效的答案,所以你可以改为'SELECT * FROM valid_answers'。 ** 2)**需要包含'forum_id',因为可能'forum2'有一个'question = 3',并且在这个查询中将会出现0.检查[** demo **](http://sqlfiddle.com /#!9/a4a9a9/1) –

+0

@JuanCarlosOropeza好点! –