2017-10-18 1 views
0

Wenn ich die folgenden Daten in der Tabelle haben answers:MySQL zählen und Gruppierungs Ergebnisse basierend auf 2 Spalten

+-------------------------------------------+ 
| 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  | 
+-------------------------------------------+ 

Wie würde ich die tally Antworten wählen? Um Ergebnisse wie z. B .:

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

Dies ist, was ich im Moment habe. Ich weiß, dass es GROUP BY verwenden muss, aber ich kämpfe, um die erwarteten Ergebnisse zurückzugeben.

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

Bitte bearbeiten Sie Ihre Frage, um uns mitzuteilen, was der Unterschied zwischen Ihrer erwarteten Antwort und der Antwort ist, die Sie von Ihrer Anfrage erhalten. Ihre Anfrage sieht gut aus. –

+0

Ich denke, dass Ihre erwartete Ausgabe falsch ist und Ihre aktuelle Abfrage korrekt ist. –

+0

@TimBiegeleisen Op möchte zählen, wie viele Benutzer B nicht beantwortet haben. In diesem Fall 0 –

Antwort

0

Versuchen Sie folgendes:

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; 

Ergebnisse:

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

Beachten Sie, dass:

In Ihrer Beispieldaten B hat 3 Einträge für Frage 2, während A keine Einträge für Frage 2 hat. Und natürlich alle für Forum = 1, so dass Ihre erwarteten Ergebnisse nicht korrekt sind, und ich denke, meiner ist der richtige.

+1

Dies ist ein sehr guter Anfang, aber einige Probleme. ** 1) ** der harte Code von '(A, B)' in der 'UNION' Ich hoffe, dass OP die gültigen Antworten in einer anderen Tabelle hat, so dass Sie stattdessen' SELECT * FROM valid_answers' wählen können. ** 2) ** muss 'forum_id' enthalten, da' 'forum2'' eine' question = 3' hat und in dieser Abfrage mit 0 angezeigt wird. Prüfe [** demo **] (http://sqlfiddle.com/#! 9/a4a9a9/1) –

+0

@JuanCarlosOropeza Gute Punkte! –

Verwandte Themen