2011-10-06 68 views
1

我试图生成一个查询来告诉我有多少产品是从网站订购的,但是在组中。使用MySQL select语句生成聚合结果

这是我的表结构(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 

我需要什么才能够得到,是用户购买订单的数量:

ONLY PRODUCT_ID 17和18

ONLY PRODUCT_ID 17和16以及15

就这么和驾驶我有点疯狂与此查询,这是1级有多个事实产品。有任何想法吗?我确信我在这里忽略了一些简单的东西。

谢谢。 B.

+0

'product_order_id'列代表什么? –

+0

如何将购买链接到用户? – Icarus

+0

我复制/粘贴样本表布局时出错。 product_order_id是唯一且连续的。还有另一个表将该order_id链接到用户标识。 – bruno

回答

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

+1此解决方案似乎符合OP的规范。 'SELECT COUNT(..)'会完成它。演示:http://sqlize.com/1UpwM87F3p – mellamokb

+0

除了需要添加(15,16,17)的部分外,它与您发布的代码非常相似。 – mellamokb

+0

@mellamokb谢谢我已经添加了该信息来澄清答案。 –

0

假设product_orders表中每个订单的product_id都是唯一的,我们可以计数匹配和不匹配并进行比较。因此,应该有两个具有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