根据查询结果和变量更新表中的记录 - 结果仅返回变量中第一个 int 的记录
Posted
技术标签:
【中文标题】根据查询结果和变量更新表中的记录 - 结果仅返回变量中第一个 int 的记录【英文标题】:Update Records in Table based on query result and variable - result only returns record for first int in variable 【发布时间】: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之外还有其他方法吗?
代码和数据
sql and data at gist sqlfiddle demo【问题讨论】:
这是我试图避免临时表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
【参考方案1】:
也许你可以使用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);
Demo fiddle
更新第 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
【讨论】:
你知道为什么ID in @myVar
不起作用吗?
哦,是的。我记得以前遇到过类似的事情,但我找不到任何有关它的官方 mysql 文档。不过,我对this answer 的解释很满意。希望对你有帮助以上是关于根据查询结果和变量更新表中的记录 - 结果仅返回变量中第一个 int 的记录的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft Access 中的选择查询在另一个表中查找返回错误结果的记录
在 WHERE/Joining 3 个表中进行子查询,2 个用于记录,1 个用于数字,不返回结果/失败 - MSAccess