我正在尝试生成一个查询,告诉我从网站订购了多少产品,但是是小组。
这是我的表格的结构(product_orders):
product_order_id | order_id | product_id
168 | 64 | 17
168 | 64 | 18
168 | 64 | 16
168 | 64 | 15
168 | 64 | 19
168 | 65 | 17
168 | 65 | 18
168 | 66 | 16
168 | 66 | 15
168 | 66 | 19
168 | 67 | 15
我需要获得的是用户购买的订单数量:
仅限product_id 17和18
仅限product_id 17 AND 16 AND 15
这就是那个让我对这个查询有点疯狂的事情,以及这个1个订单有多个产品的事实。有任何想法吗?我确定我在这里忽略了一些简单的东西。
感谢。 乙
答案 0 :(得分:1)
您可以使用相当笨重的EXISTS
声明
SELECT COUNT(DISTINCT order_id) FROM product_orders p1
WHERE EXISTS (SELECT * FROM product_orders p2
WHERE p1.order_id = p2.order_id
AND p2.product_id = 17)
AND EXISTS (SELECT * FROM product_orders p3
WHERE p1.order_id = p3.order_id
AND p3.product_id = 18)
AND NOT EXISTS (SELECT * FROM product_orders p4
WHERE p1.order_id = p4.order_id
AND p4.product_id <> 17
AND p4.product_id <> 18);
显然,您可以为{15,16,17}
集重复此模式。
答案 1 :(得分:0)
假设product_id在product_orders表中每个订单都是唯一的,我们可以计算匹配和非匹配并进行比较。因此,product_id 17或18应该只有两个条目,并且没有17个或18个条目与第一个方案匹配。第二种情况是相同的逻辑,除了应该有正好三个带有product_id 15或16或17的条目,并且没有任何不匹配的条目:
select count(*) from (
select distinct order_id from product_orders po1
where (
(select count(product_id) from product_orders po2
where po1.order_id = po2.order_id and
po2.product_id in (17, 18)) = 2
and
(select count(product_id) from product_orders po3
where po1.order_id = po3.order_id and
po3.product_id not in (17, 18)) = 0
) or (
(select count(product_id) from product_orders po4
where po1.order_id = po4.order_id and
po4.product_id in (15, 16, 17)) = 3
and
(select count(product_id) from product_orders po5
where po1.order_id = po5.order_id and
po5.product_id not in (15, 16, 17)) = 0
)
) p
只有一个订单满足所有条件:order_id 65。