如何计算customer_id,其中store_id计数超过1

时间:2016-05-28 19:51:37

标签: mysql sql select

我有一个像db这样的数据库:

+---+-------------+----------
|id | customer_id | store_id|
+---+-------------+----------
|1  | 1           | 1001|
|2  | 1           | 1002|
|3  | 1           | 1001|
|4  | 1           | 1003|
|5  | 2           | 1001|
|6  | 2           | 1001|
|7  | 3           | 1001|
|8  | 3           | 1002|
|9  | 3           | 1001|
|10 | 4           | 1003|
|11 | 4           | 1001|
|12 | 4           | 1002|
+---+-------------+----------

我希望计算不同的customer_id,其中购物不同shop_id超过值1.(对于exp.customer_id 1购物1001,1002和customer_id 4购物1001,1002,1003和customer_id 3购物1001,1002但是customer_id 2只购物1001)

3 个答案:

答案 0 :(得分:1)

您可以使用嵌套查询 - 内部查询只过滤具有多个商店ID的客户ID,而外部查询则计算它们:

SELECT COUNT(*)
FROM   (SELECT   customer_id
        FROM     my_table
        GROUP BY customer_id
        HAVING   COUNT(DISTINCT store_id) > 1) t

请注意,内部查询中的group by已经返回不同的客户ID,因此外部查询在其distinct调用中不需要count

答案 1 :(得分:0)

使用子查询为每个customer_id计算store_id,并计算该计数超过一个的行

SELECT COUNT(*) 
FROM (SELECT count(*) cnt
        FROM my_table
        GROUP BY customer_id
     ) t
WHERE cnt > 1 

答案 2 :(得分:0)

这是一种只有一级聚合的方法:

select count(distinct customer_id)
from t
where exists (select 1 
              from t t2
              where t2.customer_id = t.customer_id and
                    t2.store_id <> t.store_id
             );

此查询应该能够利用t(customer_id, store_id)上的索引,这可能会为其带来性能优势。