问题描述
我想更新表 User 中不存在于表 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
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 之外还有其他方法吗?
代码和数据
解决方法
也许你可以只使用NOT EXISTS:
UPDATE Users u
SET u.IsActive=0
WHERE NOT EXISTS
(SELECT user_id FROM UserActions ua
WHERE (ua.Type = "Login" OR ua.Type = NULL) AND u.ID=ua.user_id);
更新第 3 方编辑
如果你想使用一个变量,你可以用 find_in_set
SET @userIDs := (
SELECT GROUP_CONCAT(u.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);
然后
SELECT * FROM Users WHERE FIND_IN_SET(Users.ID,@userIDs);
看到这个dbfiddle