2016-11-30 17 views
1

テーブルBのテーブルAと一致するレコードを取得する必要がありますが、これを1つのクエリで実行できるかどうかはわかりません。すべての左レコードが右にあるMySQL結合テーブル

id | order_id | title 
---------------------------------- 
1 | 1114  | Product 1 
2 | 1115  | Product 1 
3 | 1115  | Product 2 
4 | 1116  | Product 1 
5 | 1117  | Product 3 
6 | 1118  | Product 4 
7 | 1118  | Product 5 

表B今

id | order_id | a_id | title 
---------------------------------- 
1 | 2221  | 1 | Product 1 
2 | 2222  | 2 | Product 1 
3 | 2222  | 3 | Product 2 
4 | 2223  | 7 | Product 5 

私はこれがにつながるすべての製品は、テーブルBにもあるテーブルAからのすべてのorder_idの値が必要になります。

1114 
1115 

b.a_idの値がないため、1116が失敗する4
1117何らb.a_idがないためではない67両方がb.a_id

であるため、値5
1118が失敗した失敗した私は、INNER JOINを試してみましたが、これはまた1118を返します。私はまたWHERE b.a_id IS NULLLEFT JOINを試しましたが、それはまったく反対です。だから私はRIGHT JOINを試しましたが、それも1118を返します。

このSQL Fiddleを参照してください。

私は自分の目標が何であるかを明確にしたいと思いますが、これが1つのクエリで管理できるかどうか不思議です。

答えて

1

これは完璧ではありませんが、SQL Fiddleを使用して既存のデータに対して正しい結果を返します。多分あなたはこれを出発点として使うことができますか?

SELECT a.order_id, count(distinct a.id) as aCount, count(distinct b.a_id) as bCount 
FROM a 
LEFT JOIN b ON a.id = b.a_id 
GROUP BY a.order_id 
HAVING aCount = bCount; 
+1

。私は実際のデータ、テーブルA〜800.000レコード、B〜45.000レコードで自分のデータベースを実行します。クエリは〜600msで実行されます。 – Timo002

1

これは、単一のクエリでなんとかです:これは確かに正しい答えを私に与え

SELECT a.order_id, COUNT(a.id) as cntA, COUNT(b.id) AS cntB 
FROM a 
    LEFT JOIN b ON a.id = b.a_id 
GROUP BY a.order_id 
HAVING cntA = cntB; 
+0

Dave Rixと同じ答え!しかし、これは確かに仕事です! – Timo002

関連する問題