2012-03-19 9 views
2

テーブルのカウントを取得するクエリを作成しようとしています(アイテムと呼ぶ)、2つの異なるもので分類され、タイプとコードと呼ばれます。私が出力として望んでいるのは次のとおりです:ダブルグループを持つクエリから0のカウントを取得する

Type Code Count 
1 A 3 
1 B 0 
1 C 10 
2 A 0 
2 B 13 
2 C 2 

などです。

タイプとコードの両方がルックアップテーブルにあり、各アイテムは1つのタイプだけで複数のコードを持つことができるため、コードのピボット(別名ジャンクションまたは結合)テーブルもあります。

Type Code Count 
1 A 3 
1 C 10 
2 B 13 
2 C 2 

と(省略結合条件を持つ)のように見える:私はこの結果を得ることができ、クエリを持って

SELECT typelookup.name, codelookup.name, COUNT(item.id) 
FROM typelookup 
LEFT OUTER JOIN item JOIN itemcodepivot 
RIGHT OUTER JOIN codelookup 
GROUP BY typelookup.name, codelookup.name 

は、私は結果を取得するには、このクエリを変更する方法はあります探している?これが重要なのであれば、これはMySQLにあります。私は実際にこれがすべて1つのクエリで可能であるとは確信していませんが、もしそれが本当なら、どうやって知りたいのですか。任意のアイデアをありがとう。

答えて

4

A typelookupcodelookupCROSS JOINは、この問題を解決する必要があります。

SELECT t.name, c.name, COUNT(item.id) 
FROM typelookup t 
CROSS JOIN codelookup c 
LEFT JOIN itemCodePivot icp ON icp.codeId = c.codeId 
LEFT JOIN item i ON i.itemId = icp.itemId AND i.TypeId = t.TypeId 
GROUP BY t.name, c.name 
+0

これはうまくいきません...私は1 A = 2 A = 3A、1B = 2B、それらのどれも0ではありません。 – Maltiriel

+0

これは理論的には機能するはずです...カウントが0の行がない場合は、何かが間違っています。あなたの 'join on'節の代わりに' where'節の項目を除外していますか? –

+0

WHERE句の唯一のものは、型とコードの両方がアクティブである(t.active> 0かつc.active> 0であることを確認する)ことです。そうでなければあなたが入力したのとまったく同じです。 – Maltiriel

0

私の代わりに実際のJOIN条件を使用する必要があることに注意してください。

SELECT tl.name, cl.name, IFNULL(COUNT(i.id),0) 
FROM typelookup tl 
LEFT JOIN item i ON tl.item_id = i.id 
LEFT JOIN itemcodepivot icp ON icp.item_id = i.id 
LEFT JOIN codelookup cl ON cl.id = icp.codelookup_id 
GROUP BY tl.name, cl.name; 

あなたのカウントがどのように見えるかをご覧ください。

codelookupでRIGHT JOINの必要性を理解できません。これが(編集)できない場合は、それを追加してみてください。

+0

はい、私は加入条件を省略していると述べました。彼らは本当の質問にそこにいます。実際のテーブルは大きく、他にもたくさんのものがあります。私は実際にこのクエリに関連している唯一の列を与えました。何を知る必要がありますか?繰り返しますが、私が書いたクエリーでは、指定されたタイプとコードのアイテムがある限り、カウントが正常に機能することが分かりました。 – Maltiriel

+0

内部結合に変更すると、元のクエリと同じ結果が得られます。 – Maltiriel

+0

@Maltiriel編集しました。試してみたいことがあります。 – Aaron

3

これに対してクロス結合を使用できますか?クロスがすべての種類を取得する必要があります参加 http://dev.mysql.com/doc/refman/5.0/en/join.html

SELECT typelookup.name, codelookup.name, COUNT(item.id) 
FROM codelookup CROSS JOIN typelookup 
LEFT OUTER JOIN item JOIN itemcodepivot 
GROUP BY typelookup.name, codelookup.name 

は.. ..あなたはすべてのテーブルの宣言を持っていないが、あなたはそれを試してみることができたときに、正しいSQLを作るのは難しいすべてのコードと結合

+0

+1 ...分でそれに私を打つ。 –

+0

これを試していますが、構文エラーが発生しています。何度も間違って入力しているのか、クロスジョインの構文があるのか​​分かりません。 ETA他にどのような表宣言が必要ですか? – Maltiriel

+0

最後に私の構文エラーを解決しました。 – Maltiriel

関連する問題