根据查询结果和变量更新 Table 中的记录 - 仅结果 returns 变量中第一个整数的记录

Update Records in Table based on query result and variable - result only returns record for first int in variable

我想更新 table 用户中不存在于 table UserActions 中的记录(参见 sqlfiddle demo or sql and data at gist.github

我的table

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。

此查询 returns 从未登录的用户 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 or so i thought that 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 包含所有从未登录过的相关用户 ID (2,4)

但是这个说法

SELECT * FROM Users where ID in (@userIDs);

只有 returns 第一个结果。

问题

代码和数据

也许你可以使用 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