gpt4 book ai didi

mysql - 如果计数> 5,如何从表中删除记录

转载 作者:行者123 更新时间:2023-11-29 05:04:52 25 4
gpt4 key购买 nike

我有下表:

id  systemid    value
1 1 0
2 1 1
3 1 3
4 1 4
6 1 9
8 1 10
9 1 11
10 1 12

现在这里我有 8 条 systemid = 1 的记录,所以现在我只想保留最新的 3 条记录(降序排列)并删除 systemid=1 的旧记录>/p>

我想要这样的输出:

id    systemid    value
8 1 10
9 1 11
10 1 12

我只想删除 systemid=1 的旧记录,前提是它的计数 > 5,并保留其最新的 3 条记录。

我如何在查询中执行此操作?

最佳答案

如果您并不总是有 8 条记录,并且想从 systemid=1 的表中选择最后 3 条记录,但是有很多记录,那么一个好的方法是在您的 SQL 语句中使用 IN 选择器。

如果您可以简单地使用语句来做到这一点,那就太好了

SELECT * FROM mytable WHERE id IN (SELECT id FROM `mytable` WHERE systemid=1 ORDER BY id DESC LIMIT 3)

然而,这在 MySQL 中尚不支持,如果您尝试这样做,您将收到类似

的错误
...doesn't yet support 'LIMIT & IN/ALL/SOME subquery'

所以你需要一个解决方法如下(使用SELECT来测试):

SET @myvar := (SELECT GROUP_CONCAT(id SEPARATOR ',') AS myval FROM (SELECT * FROM `mytable` WHERE systemid=1 ORDER BY id DESC LIMIT 3 ) A GROUP BY A.systemid);
SELECT * FROM mytable WHERE FIND_IN_SET(id,@myvar);

它的工作方式(第一行)是设置一个名为@myvar 的变量,如果 id 值,它将把最后 3 个值作为逗号分隔的字符串保存。在你的情况下

9,8,10

然后选择该字符串中'id'所在的行。

将“SELECT *”替换为“DELETE FROM”以最终确定结果,这样您的查询将是

SET @myvar := (SELECT GROUP_CONCAT(id SEPARATOR ',') AS myval FROM (SELECT * FROM `mytable` WHERE systemid=1 ORDER BY id DESC LIMIT 3 ) A GROUP BY A.systemid);
DELETE FROM mytable WHERE NOT FIND_IN_SET(id,@myvar);

希望对您有所帮助。

关于mysql - 如果计数> 5,如何从表中删除记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50406352/

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