2011-08-09 4 views
1

私は2つのテーブルを持っています:2つ以上の結合テーブルで重複結果を取得するにはどうすればよいですか?

  1. オーダー(id);
  2. ORDER_ITEMS(ID、ORDER_ID、ITEM_ID、量)

の私はすでに3つの異なるアイテムを注文Xを選択しているとしよう(A - 1つのユニット、B - 2つの単位及びC - 1単位)。

同じアイテムと同じ数量のアイテム(この場合はA-1ユニット、B-2ユニット、C-1ユニットがあり、それ以上またはそれ以下)はすべて取得する必要があります) 、注文X.

を除く、私はあなたが理解しやすくなりますため、期待し、テストテーブルのダンプを作ったので、私が取得したいのですがどのような:) http://nopaste.info/44eb93ae3d.html

は=受注Xとさせて頂きます1、注文3には1つのアイテムしかなく、注文4には#1と同じアイテムがありますが、1つのアイテムが余分にあるので、うまくいきません:

+0

? –

答えて

1

は、ORDER_ITEMSテーブル内の各注文の同一の発生をカウントし、次に検索順序の項目の数と比較:

SELECT i2.order_id 
FROM order_items i1 
    RIGHT OUTER JOIN order_items i2 
     ON i2.item_id = i1.item_id 
     AND i2.quantity = i1.quantity 
     AND i1.order_id = 1 
WHERE i2.order_id != 1 
GROUP BY i2.order_id 
HAVING COUNT(i1.order_id) = COUNT(*) 
    AND COUNT(i1.order_id) = (SELECT COUNT(*) FROM order_items WHERE order_id = 1) 

メモこのクエリは(order_id, item_id)order_itemsテーブルのキーであることを前提としています。

I have made a sample test here.

+0

小さな構文エラーがありました。私はこの部分を少し変更しました:COUNT(i2.order_id = 'X' THEN 1 ELSE 0 END)の場合、それは注文Xの少なくとも1つの同じ項目を持ついくつかの注文を返します。これは私のものではありません取得したい。ところで、結果では、いくつかの正しく選択された注文もあります:) – kpns

+0

あなたは正しいです、私はCASEに 'END'を忘れました。代替案が必要な場合は、COUNT(i2.order_id = 'X' THEN 1 ELSE NULL END)またはSUM(WHERE i2.order_id = 'X' THEN 1 ELSE 0 END)を実行します。それ以外の場合、カウントは0もカウントします。 –

+0

ありがとうございますが、私があなたの提案したようなクエリを変更した場合、結果はまったくありません。私はMyResultの部分を実行し、numberOfSameOrderが正しくカウントされていないことを確認しました(同じ項目の数を数えますが、すべての項目を順番に数えていません)。またnumberOfOrderXの結果はX、だからどこの句はちょうど、私は答える前にテストする必要があります: – kpns

0
select * 
from orders o 
JOIN order_items oi ON o.id = oi.order_id 
JOIN (select * 
     from orders o2 
     JOIN order_items oi2 ON o2.id = oi2.order_id 
     WHERE o2.id = @X) sub 
ON oi.quantity = sub.quantity 
AND oi.item_id = sub.item_id 
WHERE o.id <> @X 

EDIT:順序はXよりも同じ項目、さらにより多くのアイテムを持っている場合は必要何が起こるか

select * 
from orders o 
JOIN order_items oi ON o.id = oi.order_id 
JOIN (select * 
     from orders o2 
     JOIN order_items oi2 ON o2.id = oi2.order_id 
     WHERE o2.id = @X) sub 
ON oi.quantity = sub.quantity 
AND oi.item_id = sub.item_id 
AND NOT EXISTS (select 1 
       from order_items 
       where order_id = o.id 
       and concat(item_id,quantity) not in (select concat(itemid,quantity) 
                from order_items 
                where order_id = o.id)) 
WHERE o.id <> @X 
+0

ここでは、私はScopri0のクエリのようにまったく同じ結果を得る。これらのクエリは、注文Xの少なくとも1つの同じ項目を持つ注文を受け取ります。これは間違っています – kpns

+0

ok、私の編集を試すことができますか? – StevieG

+0

いいえ、動作していませんでした。とにかくありがとうございました :) – kpns

関連する問題