我有兩個表的訂單,並與下面的結構line_items:高效的查詢發現奇異訂單產品
Orders (id = PK, indexes on user_id)
-------------------------------------
id user_id
== ======
1 1
2 2
3 1
4 3
5 1
LineItems (id = PK, indexes on order_id and product_id)
id order_id product_id quantity
== ====== ======== ======
1 1 1 1
2 1 2 2
3 2 1 4
4 2 3 6
5 3 1 1
6 4 1 1
7 5 1 1
我試圖找出解決下列要求的最有效的方法:
鑑於
user
和product
找到LineItems
屬於Orders
其中給定的產品是唯一訂購的產品。 E.g:如果user_id是1和的product_id爲1,查詢應返回行項目5和7給定一個
user
和product
找到Orders
這裏給出的產品是有序的唯一產品。 E.g:如果user_id是1和的product_id爲1,查詢應返回的訂單3和5
訂單和了LineItem表可以有幾百萬行的。
我有一個工作解決方案,使用COUNT
和HAVING
。我不確定這是最有效的解決方案。
具體而言,我想知道這是否可以通過使用Cletus
在this answer中概述的技術來解決。
說明: 我正在使用Orders和LineItems表來描述場景。我實際的表是完全不同的,它不涉及到訂單等
編輯2
這是查詢比使用GROUP BY
和HAVING
高效?
SELECT A.id
FROM LineItems A
JOIN Orders B ON B.id = A.order_id AND B.user_id = 1
LEFT OUTER JOIN LineItems C ON C.order_id = A.order_id AND
C.product_id != A.product_id
WHERE A.product_id = 1 AND C.id IS NULL
聽起來像'HAVING COUNT(...)'的教科書案例 – Phil 2011-03-31 02:51:11
我確實有基於'HAVING'和'COUNT'的解決方案。我不確定這是否是最有效的解決方案。 – 2011-03-31 02:52:22
我知道,我在說你當前的方法是合理的(請參閱zerkms的答案中的注意事項) – Phil 2011-03-31 02:53:51