2017-10-18 5 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 Opは何人のユーザーが答えなかったのかを数えたいと思っています。このケースでは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には質問2のエントリが3つありますが、Aには質問2のエントリがありません。フォーラム= 1の場合は全ての結果が間違っていますので、期待した結果が正しくないと思います。

+1

これは非常に良いスタートですが、いくつか問題があります。 ** 1)** UNIONの '(A、B)'のハードコードは、OPが別のテーブルで有効な答えを持っていて、代わりにSELECT * FROM valid_answersを実行できることを願っています。 ** 2)**は 'forum2'が' question = 3'を持つ可能性があるので 'forum_id'をインクルードする必要があり、このクエリでは0が表示されます。[** demo **](http://sqlfiddle.com /#!9/a4a9a9/1) –

+0

@JuanCarlosOropeza良い点! –

関連する問題