2017-08-12 13 views
1

私はいくつかのテーブルを持つデータベースを持っています。私はトップレベルのテーブルから4つの結合を必要とする最終的なテーブルからカウント関数を取るビューを作成しようとしています。列の値4を集計すると

これは私が持っているものです。

ClassData   SubclassData    FCStackData   
id || name   id || name || class_id  id || name || sc_id 
1 || class one  1 || sc1 || 2    1 || s1 || 2 
2 || class two  2 || sc2 || 2    2 || s2 || 2 


FlashcardData       ScoreData 
id||word || def || fcstack_id   id || correct || fcd_id 
1 || w1 || d1 || 2     1 || true || 2 
2 || w2 || d2 || 2     2 || true || 2 

わかりましたので、私はClassData.nameを選択する必要が - そして私は、それぞれ別々のクラスには、真の値を思い付くScoreDataをチェックしてくれた回数を返す正しいという列が必要です。

したがって、上記の私の基本的なテーブルでは、私は私のクエリはこれを返すようにしたい:

 Class Name  || Correct 
     class one  || null  <-- no corresponding data in scoredata 
     class two  || 2   <-- both columns in scoredata are for this 

ここで私はかなり間違っている実感が、私もこれに取り組むするかどうかはわかりません、私のクエリがあります。

SELECT ClassData.name as ClassName, 
COUNT(CASE WHEN ScoreData.correct 
= 'true' THEN 1 END) AS Correct 
FROM ((((ClassData 
INNER JOIN SubclassData ON ClassData.id = SubclassData.class_id) 
LEFT OUTER JOIN FCStackData ON SubclassData.id = FCStackData.subclass_id) 
LEFT OUTER JOIN FlashcardData ON FCStackData.id = FlashcardData.fcstack_id) 
RIGHT OUTER JOIN ScoreData ON FlashcardData.id = ScoreData.fcdata_id) 
GROUP BY ClassData.name 

注:テーブルを簡素化し、この問題の問題ではないデータを取り出して少し質問しました。

私が実際にこのクエリから取得しているのは、最初のClassData.nameアイテムとCountカラムが1(実際のDBには1つのエントリしかありません)です。

+0

は、なぜあなたは(外側の左ではなく)右の外側を使用しているがScoreDataに参加しますか? –

+0

正に、私はちょうど何が起こるかを見ることができるように、多くの組み合わせを使用して、4つの結合を変更しようとしました。これはちょうど私が止めた最後のものです。 – user3007447

+0

それは何の価値があるのか​​...内部結合Bとは、「テーブルAの行のうち、Bから少なくとも1つの対応する行がある行をすべて与えてください」という意味です。左の外部結合Bは、 Bからの行と一致するBからの複数の行が一致する場合、Aからの行が複製され、右の外部結合Bは、左の外部結合の反対を意味します(Bからのすべての行Aが存在するかどうか)。だから、あなたはおそらくすべての左外部結合をしたいと思うでしょう。 –

答えて

1

私が正しく理解していれば、その後、あなただけのクエリを通じてleft join秒たい:

SELECT cd.name as ClassName, 
     SUM(CASE WHEN sd.correct = 'true' THEN 1 ELSE 0 END) AS Correct 
FROM ClassData cd LEFT JOIN 
    SubclassData scd 
    ON cd.id = scd.class_id LEFT JOIN 
    FCStackData fsd 
    ON scd.id = fsd.subclass_id LEFT JOIN 
    FlashcardData fcd 
    ON fsd.id = fcd.fcstack_id LEFT JOIN 
    ScoreData sd 
    ON fcd.id = sd.fcdata_id 
GROUP BY cd.name; 
+0

私はそれを試しましたが、私はどこに間違っていたのかを確認するために異なるジョイントを読んでいたので...しかし、はい、あなたは正しいです!ありがとう! – user3007447

関連する問題