问题描述
我有2张桌子
- 订单(id,订单名称)
- 物品(id,order_id,item_name)
“订单”表中的每个订单在“项目”表中列出了1到n个项目。
我想要执行的查询返回所有包含汉堡,比萨和可乐的订单。
下面的通话是进行此类查询的最佳方式吗?
SELECT disTINCT ON (orders.id)
orders.id
FROM orders
INNER JOIN items i1 on orders.id = i1.order_id
INNER JOIN items i2 on orders.id = i2.order_id
INNER JOIN items i3 on orders.id = i3.order_id
WHERE i1.item_name = 'Burger'
AND i2.item_name = 'Fries'
AND i3.item_name = 'Coke'
解决方法
您的方法可行,并且应该相对有效。假设没有重复的订单ID /商品名称,则可以从另一个查询中删除distinct
,从而避免了不必要的工作。
您还可以使用聚合。当项目数量增加时,它涉及的附加键入较少:
select o.*
from orders o
inner join items i on i.order_id = o.id
where i.item_name in ('Burger','Fries','Coke') -- any of the three items
group by o.order_id
having count(*) = 3 -- all items match
同样,这假设项目中没有重复项;否则,您需要使用having count(distinct i.item_name) = 3
。