2017-05-25 51 views
2

我有兩個表= subjectsstats其他表中的計數值

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

我需要什麼,例如對於給定的user_id(如2),讓所有的人(從受試者表),併爲那些他做(從統計)的正確的真/假伯爵像這個:

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

我不知道該怎麼做。

回答

6

您可以通過兩個表格之間的連接以及一些條件聚合來完成此操作,以計算真假答案的數量。

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

好像他們希望有一個'LEFT JOIN'因爲他們想返回所有科目用戶即使沒有統計。 – ollie

+0

非常感謝您的快速回答。正如ollie所說,這隻會返回來自用戶有統計信息的主題的行。我想從主題的所有行。 我試圖改爲'SELECT t2.id, t2.name, SUM(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 FROM受試者t2的 LEFT JOIN統計點t1 ON t2.id = t1.subject_id WHERE t1.user_id = 2 GROUP BY t2.id,t2.name'但同樣的事情 – AlainIb

+0

@ AlainIb從'subjects'到'stats'做一個'LEFT JOIN'。這應確保每個主題始終顯示您選擇的每個用戶。對不起,但Rextester和SQLFiddle現在都有問題,所以我無法做任何測試。 –

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

非常感謝你。這項工作也是。 – AlainIb

相關問題