2017-05-25 6 views
2

私は2つのテーブル= subjectsstatsを持っています。私は弾力user_id(2のように)正しい真/偽の回数を、(対象テーブルから)すべての科目を取得し、もののために、彼は(統計から)行うために、たとえば、必要なもの他のテーブルのカウント値

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

のようなこれは:

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

これを実行するには、2つのテーブル間の結合と、条件付き集計を使用して、真と偽の回答の数を集計します。彼らは何の統計情報が存在しない場合でも、ユーザーのすべての科目を返すようにしたいので、彼らは `LEFT JOIN`をしたいよう

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

は思えます。 – ollie

+0

すばらしい答えに感謝します。 ollieは、この返信は、ユーザーが統計情報を取得している科目からの行のみを示しています。私は科目からすべての行が欲しい。 私は 'correct_true、 SUM(CASE WHEN t1.correct =「falseと t2.id、 t2.name、 SUM(CASE t1.correct = 'true' をTHEN ELSE 1 0 END)を選択するように変更してみてください被験者からAS correct_false 'THEN 1 ELSE 0 END)が LEFTは統計t2.id = t1.subject_id ONをt1のJOIN t2のWHERE t2.id、t2.name'同じもの – AlainIb

+0

BY t1.user_id = 2 GROUP @ AlainIb '被験者'から '統計情報 'への' 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

関連する問題