gpt4 book ai didi

mysql - 将 IN 转换为 EXISTS 以统计进行过多种操作的用户

转载 作者:行者123 更新时间:2023-11-30 22:53:48 25 4
gpt4 key购买 nike

我有一个包含用户、时间戳和不同类型操作的表格。我们称它们为类型 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com