Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 转换为EXISTS用于计算已执行多种操作的用户数_Mysql_Sql_Select_Group By_Exists - Fatal编程技术网

Mysql 转换为EXISTS用于计算已执行多种操作的用户数

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

我有一个充满用户、时间戳和不同类型操作的表。我们称之为A型、B型和C型:

| 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