我有以下mySQL查询,它返回一个ID列表。 我想从表“serverking_user”
中删除列表中每个ID的行SELECT serverking_user.id FROM (serverking_user
INNER JOIN serverking_logins
ON serverking_user.id=serverking_logins.uid)
WHERE serverking_logins.time < 3600
GROUP BY serverking_user.id
HAVING COUNT(serverking_logins.login) = 1
一种可能性是使用“in”遍历每个ID。但是由于在我的Sql Server上取消激活“in”,我需要通过“join”来解决这个问题。
有什么想法吗?
答案 0 :(得分:2)
自从我完成MySQL开发以来已经有一段时间了,但是如果我没记错的话,这应该适合你:
DELETE su
FROM serverking_user su
INNER JOIN serverking_logins sl
ON su.id=sl.uid
WHERE sl.time < 3600
GROUP BY su.id
HAVING COUNT(sl.login) = 1
通常,如果要从JOIN中的单个表中删除记录,只需在DELETE
更新查询
似乎MySQL不喜欢删除涉及分组查询的位置,因此另一种可能性是使用反连接。但是,我确信此查询的性能特征不是最理想的。最好使用两个单独的查询。尽管如此,这是一个使用反连接的解决方案:
DELETE su
FROM serverking_user su
INNER JOIN serverking_logins sl
ON su.id=sl.uid
LEFT JOIN serverking_logins antisl
ON sl.uid = antisl.uid
AND sl.id <> antisl.id
WHERE sl.time < 3600
AND antisl.id IS NULL
答案 1 :(得分:1)
DELETE FROM serverking_user
WHERE EXISTS
(SELECT *
FROM (serverking_user
INNER JOIN serverking_logins
ON serverking_user.id=serverking_logins.uid)
WHERE serverking_logins.time < 3600
GROUP BY serverking_user.id
HAVING COUNT(serverking_logins.login) = 1) a
答案 2 :(得分:1)
也许您可以将select的结果存储在表变量中,然后加入?
declare @Ids table
(
Id int
);
insert into @Ids (Id)
SELECT serverking_user.id FROM (serverking_user
INNER JOIN serverking_logins
ON serverking_user.id=serverking_logins.uid)
WHERE serverking_logins.time < 3600
GROUP BY serverking_user.id
HAVING COUNT(serverking_logins.login) = 1;
delete yt from YourTable yt
inner join @Ids Ids on Ids.Id = yt.id;
请注意,这一点的一致性取决于您的事务配置,因为您在这里进行了两次单独的查询。