2017-05-25 2 views
2

Ich habe zwei Tabellen = subjects und stats.Zählwerte in anderen Tabelle

-- subjects --    
------------------   
| id | name |   
------------------   
| 1 | subjecta |   
| 2 | subjectb |  
| 3 | subjectc |   
| 4 | subjectd |   
| 5 | subjecte |   
| 6 | subjectf |   
| 7 | subjectg |  
| 8 | subjecth |   
| 9 | subjecte |  
| ... | subjectf |  
------------------  

-- stats -- 
----------------------------------- 
| user_id | subject_id | correct | 
----------------------------------- 
| 1  | 1  | false | 
| 1  | 1  | false | 
| 1  | 2  | false | 
| 4  | 3  | false | 
| 4  | 4  | false | 
| 4  | 5  | false | 
| 2  | 1  | true | 
| 2  | 1  | true | 
| 2  | 2  | false | 
| 2  | 2  | true | 
| 2  | 3  | false | 
--------------------------------- 

Was ich brauche, zum Beispiel für ein give user_id (wie 2), erhalten alle Fächer (von Fächern Tabelle) und für die, die er tun (von Statistiken) die Anzahl der richtig wahr/falsch wie dies:

-------------------------------------------------- 
| id | name  | correct true | correct false| 
----------------------------------|---------------- 
| 1 | subjecta |  2  |  0  | 
| 2 | subjectb |  1  |  1  | 
| 3 | subjectc |  0  |  1  | 
| 4 | subjectd |  0  |  0  | 
| 5 | subjecte |  0  |  0  | 
| 6 | subjectf |  0  |  0  | 
| 7 | subjectg |  0  |  0  | 
| 8 | subjecth |  0  |  0  | 
| 9 | subjecte |  0  |  0  | 
| ... | subjectf |  0  |  0  | 
----------------------------------|--------------| 

Ich habe keine Ahnung, was ich tun soll.

Antwort

6

Sie können dies mit einem Join zwischen Ihren beiden Tabellen erreichen, zusammen mit einer bedingten Aggregation, um die Anzahl der richtigen und falschen Antworten zu ermitteln.

SELECT 
    t1.id, 
    t1.name, 
    SUM(CASE WHEN t2.correct = 'true' THEN 1 ELSE 0 END) AS correct_true, 
    SUM(CASE WHEN t2.correct = 'false' THEN 1 ELSE 0 END) AS correct_false 
FROM subjects t1 
LEFT JOIN stats t2 
    ON t1.id = t2.subject_id AND 
     t2.user_id = 2 
GROUP BY t1.id, t1.name 
+1

Scheint, wie sie einen 'LEFT JOIN' wollen, weil sie alle Fächer für einen Benutzer auch zurückkehren wollen, wenn es keine Statistiken gibt. – ollie

+0

vielen dank für die schnelle antwort. wie ollie sagt das return only row aus themen, in denen benutzer stats haben. Ich möchte alle Zeilen von Themen. Ich versuche SUM SELECT t2.id, t2.name, zu ändern (CASE WHEN t1.correct = 'true' THEN 1 ELSE 0 END) AS correct_true, SUM (CASE WHEN t1.correct false‘= 'THEN ELSE 1 0 END) AS correct_false von Subjekten t2 LEFT JOIN-Statistik t1 t2.id ON = t1.subject_id WHERE t1.user_id = 2 GROUP BY t2.id, t2.name' aber elbe – AlainIb

+0

@ AlainIb Mache eine "LINKE VERBINDUNG" von "Themen" zu "Statistiken". Dies sollte sicherstellen, dass jedes Thema immer für jeden einzelnen Benutzer angezeigt wird, den Sie auswählen. Entschuldigung, aber sowohl Rextester als auch SQLFiddle haben gerade Probleme, daher konnte ich keine Tests durchführen. –

2
select subjects.id, subjects.name, coalesce(t.correct_true, 0), coalesce(t.correct_false, 0) 
from subjects 
left join (
SELECT 
    subject_id, 
    SUM(CASE WHEN correct = 'true' THEN 1 ELSE 0 END) AS correct_true, 
    SUM(CASE WHEN correct = 'false' THEN 1 ELSE 0 END) AS correct_false 
    FROM stats 
    where user_id = 2 
    group by subject_id 
) t 
on subjects.id = t.subject_id 
+0

vielen Dank. das funktioniert auch. – AlainIb

Verwandte Themen