根据查询结果和变量更新 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 第一个结果。
问题
- 为什么
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
我想更新 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 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 第一个结果。
问题
- 为什么
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