使用MySQL select语句生成聚合结果

时间:2011-10-06 03:10:07

标签: mysql

我正在尝试生成一个查询,告诉我从网站订购了多少产品,但是是小组。

这是我的表格的结构(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个订单有多个产品的事实。有任何想法吗?我确定我在这里忽略了一些简单的东西。

感谢。 乙

2 个答案:

答案 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。

工作演示:http://sqlize.com/5Q5Lo7Oa71