如何解决根据查询结果和变量更新表中的记录 - 结果仅返回变量中第一个 int 的记录 问题代码和数据
我想更新表 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。