一列的MySQL计数唯一,其中另一列在Group By中具有单个值

一列的MySQL计数唯一,其中另一列在Group By中具有单个值,mysql,sql,select,group-by,Mysql,Sql,Select,Group By,请看下表。我想计算不同的访客id,按组id分组,但只计算结果总是“拒绝”该访客的访客id 差不多 SELECT group_id, COUNT(DISTINCT visitor_id) AS always_declines FROM customer_actions WHERE outcome='declined' [[AND HAS NEVER BEEN IN ('purchased')]] GROUP BY group_id; 以下是我的表格的简化版本: SELECT * FROM cu

请看下表。我想计算不同的访客id,按组id分组,但只计算结果总是“拒绝”该访客的访客id

差不多

SELECT group_id, COUNT(DISTINCT visitor_id) AS always_declines
FROM customer_actions 
WHERE outcome='declined' [[AND HAS NEVER BEEN IN ('purchased')]]
GROUP BY group_id;
以下是我的表格的简化版本:

SELECT * FROM customer_actions;
+----+------------+-----------+----------+
| id | visitor_id | outcome   | group_id |
+----+------------+-----------+----------+
|  1 |          5 | purchased |        1 |
|  2 |          5 | purchased |        1 |
|  3 |          6 | purchased |        1 |
|  4 |          7 | declined  |        1 |
|  5 |          6 | declined  |        1 |
|  6 |          7 | purchased |        1 |
|  7 |          8 | declined  |        1 |
|  8 |          8 | declined  |        1 |
+----+------------+-----------+----------+
8 rows in set (0.00 sec)
因此,基本上,如果它起作用,那么我将查找本例中返回的第一行也是唯一一行:

组id=1

always_denses=1对应于仅拒绝过的访客8,not exists操作员应执行以下操作:

SELECT   group_id, COUNT(DISTINCT visitor_id) AS always_declines
FROM     customer_actions  ca1
WHERE    NOT EXISTS (SELECT *
                     FROM   customer_actions ca2
                     WHERE  ca1.group_id = ca2.group_id AND
                            ca1.visitor_id = ca2.visitor_id AND
                            ca2.outcome != 'declined')
GROUP BY group_id;

一种方法是将其作为两个聚合。首先,按团体和访客进行聚合,以获得合适的访客。然后计算剩余的行数:

SELECT group_id, count(*) AS always_declines
FROM (SELECT group_id, visitor_id
      FROM customer_actions 
      GROUP BY group_id, visitor_id
      HAVING SUM(outcome <> 'declined') = 0
     ) gv
GROUP BY group_id;

抱歉,这不起作用。它返回的值为3,而不是1,表示“总是”递减。@JonRobinson。当然了。不需要where子句。此解决方案实际上要快得多。