我正在努力寻找执行Postgres查询的最有效方法。
我有两张桌子
- 订单(id,order_name(
- 项目(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
。