根据查询结果和变量更新表中的记录 - 结果仅返回变量中第一个 int 的记录 问题代码和数据

问题描述

我想更新表 User 中不存在于表 UserActions 中的记录(请参阅 sqlfiddle demosql 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 questionthis 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);

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