根据查询结果和变量更新表中的记录 - 结果仅返回变量中第一个 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 的记录的主要内容,如果未能解决你的问题,请参考以下文章

PHP运行查询关闭每个数组变量并返回表中的结果

Microsoft Access 中的选择查询在另一个表中查找返回错误结果的记录

在 WHERE/Joining 3 个表中进行子查询,2 个用于记录,1 个用于数字,不返回结果/失败 - MSAccess

外连接查询

sql根据一个字段更新另一字段

update更新一条查询结果