2011-08-09 52 views
1

我有兩個表格:如何在兩個或多個連接表中獲得重複結果?

  1. orders(id);
  2. ORDER_ITEMS(ID,ORDER_ID,ITEM_ID,數量)

比方說,我已經選擇的順序X具有3個不同的產品(A - 1個單元,B - 2個單位和C - 1個單位)。

我需要獲得所有具有相同項目和完全相同數量項目的訂單(在這種情況下:A - 1個單位,B - 2個單位和C - 1個單位,不多或少於:)) ,但不包括訂單X.

我做的測試表的轉儲,所以,我希望,對你會更容易理解,我想會得到什麼:) http://nopaste.info/44eb93ae3d.html

讓我們假設順序X = 1,因此所需的輸出將只是順序2,因爲3階只有一個項目,爲了4具有相同的項目#1,但它也一項額外的,所以不是好:)

+0

如果一個訂單比X相同的項目,甚至更多的項目必須會發生什麼? –

回答

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(CASE WHERE i2.order_id ='X'THEN 1 ELSE 0 END),然後它返回一些訂單,至少有一個訂單X的相同項目。這不是我想要的喜歡得到。順便說一句,在結果中,也有一些正確選擇的訂單:) – kpns

+0

你是對的,我忘了'結束'的情況。如果你想要一個替代方案,那麼做COUNT(CASE WHEN i2.order_id ='X'THEN 1 ELSE NULL END)或SUM(CASE WHEN i2.order_id ='X'THEN 1 ELSE 0 END)。否則計數也會計數爲0。 –

+0

謝謝,但如果我修改查詢像你建議,我根本得不到結果。什麼是錯在這裏:)我執行MyResult部分,發現numberOfSameOrder不正確計數(它計算同一項目的數量,但不是一切爲了項目)和numberOfOrderX的結果是> 0只在爲了X,所以「where」子句無法正常工作,恕我直言:) – 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 

編輯:

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的相同項目。這是錯誤的 – kpns

+0

好的,你可以嘗試我的編輯嗎? – StevieG

+0

不,不起作用。不管怎樣,謝謝你 :) – kpns

相關問題