gpt4 book ai didi

mysql - 如何从 MySQL 表中选择数据并删除其他所有内容?

转载 作者:可可西里 更新时间:2023-11-01 08:16:58 25 4
gpt4 key购买 nike

我有一个像这样的简单 MySQL 表:

CREATE TABLE `logins` (
`user` int(10) NOT NULL,
`time` int(10) NOT NULL,
`ip` varchar(20) NOT NULL,
PRIMARY KEY (`user`,`time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

使用 CRON,每 24 小时,我都会以一种只为每个用户的 IP 保留唯一登录的方式对该表执行清理,即如果某个用户从 IP X 登录 5 次,我只保留 < strong>最近一次 他使用该 IP 登录并删除剩余的 4 个。

这是我的查询:

DELETE FROM `logins` WHERE (`user`, `time`) NOT IN(
SELECT `user`, `maxtime`
FROM(
SELECT `user`, MAX(`time`) as `maxtime` FROM `logins` GROUP BY `user`, `ip`
) as `a`
)

这种查询-子查询的方式有点慢。完成大约需要 3 秒。

但是,内部的速度非常快。如果我只遗漏了 SELECT 部分,像这样:

SELECT `user`, MAX(`time`) as `maxtime` FROM `logins` GROUP BY `user`, `ip`

不到 0.005 秒。

所以我想知道:如果我做相反的事情会怎样?不是“删除所有但 X”,而是“选择 X,删除所有,重新插入 X”?

这可能吗?

像这样:

1) SELECT `user`, MAX(`time`) as `maxtime` FROM `logins` GROUP BY `user`, `ip`
/* store this somewhere temporarily */

2) TRUNCATE TABLE `logins`

3) reinsert data from step 1 to `logins`

最佳答案

使用另一个(临时或非临时)表插入您要保留的数据。截短。然后插回去……

INSERT INTO LoginsTemp 
SELECT * FROM Logins WHERE ...;

TRUNCATE Logins;

INSERT INTO Logins
SELECT * FROM LoginsTemp;

关于mysql - 如何从 MySQL 表中选择数据并删除其他所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23371543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com