Mysql 转换为EXISTS用于计算已执行多种操作的用户数
我有一个充满用户、时间戳和不同类型操作的表。我们称之为A型、B型和C型:Mysql 转换为EXISTS用于计算已执行多种操作的用户数,mysql,sql,select,group-by,exists,Mysql,Sql,Select,Group By,Exists,我有一个充满用户、时间戳和不同类型操作的表。我们称之为A型、B型和C型: | User ID | Date | ActionType | -------------------------------------- | 1 | 10/2/14 | A | | 2 | 10/12/14 | A | | 3 | 11/1/14 | B | | 1 | 11/1
| User ID | Date | ActionType |
--------------------------------------
| 1 | 10/2/14 | A |
| 2 | 10/12/14 | A |
| 3 | 11/1/14 | B |
| 1 | 11/15/14 | B |
| 2 | 12/2/14 | C |
我试图统计在一段时间内采取不同行动类型组合的用户数量——例如,在10月至12月期间同时采取行动a和行动B的用户数量
此代码可以工作(一次用于一个操作组合),但需要永远运行:
SELECT
COUNT(DISTINCT `cm0`.`User ID`) AS `Users`
FROM `mytable` AS `cm0`
WHERE
(`cm0`.`User ID` IN (SELECT `cm1`.`User ID` FROM `mytable` AS `cm1` WHERE
(`cm1`.`ActionType` = 'A' AND (`cm1`.`Date` BETWEEN dateA AND
dateB)))
AND (`cm0`.`ActionType` = 'B')
AND (`cm0`.`Date` BETWEEN dateA AND dateB))
我研究了使用常用表表达式来实现这一点的方法,然后意识到我无法在mySQL中实现这些。现在我正试图找出如何使用EXISTS而不是IN进行优化,但我很难将示例与我需要的内容相匹配。任何帮助都将不胜感激 试试这个:
SELECT COUNT(DISTINCT cm0.User_ID) AS Users
FROM mytable AS cm0
WHERE cm0.ActionType IN ('A', 'B') AND cm0.Date BETWEEN dateA AND dateB
GROUP BY cm0.User_ID
HAVING COUNT(DISTINCT cm0.ActionType) = 2;
上述查询将返回在10月至12月期间同时执行了操作A和操作B的用户数,但如果您仍要使用EXISTS
,请检查以下查询:
SELECT COUNT(DISTINCT cm0.User_ID) AS Users
FROM mytable AS cm0
WHERE EXISTS (SELECT 1 FROM mytable AS cm1
WHERE cm0.User_ID = cm1.User_ID AND cm1.ActionType = 'A' AND cm1.Date BETWEEN dateA AND dateB
) AND cm0.ActionType = 'B' AND cm0.Date BETWEEN dateA AND dateB