作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含用户、时间戳和不同类型操作的表格。我们称它们为类型 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
关于mysql - 将 IN 转换为 EXISTS 以统计进行过多种操作的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27263980/
我是一名优秀的程序员,十分优秀!