【发布时间】:2021-06-09 22:04:35
【问题描述】:
我想更新表 UserActions 中不存在的记录(请参阅sqlfiddle demo 或 sql and data at gist.github)
我的桌子
Table Users
ID | UserName | isActive
1 | Ben Busy | 1
2 | Lui Lazy | 1 <-- never logged in
3 | Emmy Eager | 1
4 | Lana Later | 1 <-- never logged in
Table UserActions
ID | User_ID | Type | ActionDate
1 | 1 | Login | 2021-01-01 <-- Joe
2 | 3 | Login | 2021-01-02 <-- Eda
3 | 1 | Login | 2021-01-02 <-- Joe
4 | 1 | Login | 2021-01-03 <-- Joe
我想为所有从未登录的用户设置 isActive = 0。
此查询返回从未登录的用户 ID:
SELECT ID FROM Users u LEFT JOIN UserActions ua
ON u.ID = ua.User_ID
AND (ua.Type = "Login" OR ua.Type = NULL)
WHERE ua.ActionDate IS NULL
我无法使用 this question 或 this question 所以我认为 using a varible SET @userIDs := (....) 应该也可以工作
SET @userIDs := (
SELECT GROUP_CONCAT(ID SEPARATOR ', ') FROM Users u LEFT JOIN UserActions ua
ON u.ID = ua.User_ID
AND (ua.Type = "Login" OR ua.Type = NULL)
WHERE ua.ActionDate IS NULL);
变量@userIDs 包含所有从未登录过(2,4) 的相关用户ID。
但是这个说法
SELECT * FROM Users where ID in (@userIDs);
只返回第一个结果。
问题
- 为什么
where ID in @myVar不起作用? - 除了使用temporary table之外还有其他方法吗?
代码和数据
【问题讨论】:
-
这是我试图避免临时表
UPDATE Users INNER JOIN (SELECT u.ID FROM Users u LEFT JOIN UserActions ua ON u.ID = ua.User_ID AND (ua.Type = "Login" OR ua.Type = NULL) WHERE ua.ActionDate IS NULL) as subquery ON u.ID = subquery.ID set u.ID = 0;但它没有在小提琴上运行(超时) -
请注意,没有任何东西等于null,甚至不等于null