私はいくつかのテーブルを持つデータベースを持っています。私はトップレベルのテーブルから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つのエントリしかありません)です。
は、なぜあなたは(外側の左ではなく)右の外側を使用しているがScoreDataに参加しますか? –
正に、私はちょうど何が起こるかを見ることができるように、多くの組み合わせを使用して、4つの結合を変更しようとしました。これはちょうど私が止めた最後のものです。 – user3007447
それは何の価値があるのか...内部結合Bとは、「テーブルAの行のうち、Bから少なくとも1つの対応する行がある行をすべて与えてください」という意味です。左の外部結合Bは、 Bからの行と一致するBからの複数の行が一致する場合、Aからの行が複製され、右の外部結合Bは、左の外部結合の反対を意味します(Bからのすべての行Aが存在するかどうか)。だから、あなたはおそらくすべての左外部結合をしたいと思うでしょう。 –