我的表如下所示:
+-----------+
| id | <- primary key
| time | <- DateTime
| row2 | <- varchar
| row3 |
| ... |
+-----------+
我想删除所有条目,除了一个,它们在一整小时的时间范围内并且具有相同的 row2 值(不同的 row2)。是否可以在没有存储过程和/或非 sql 代码的情况下执行此操作?
我的表如下所示:
+-----------+
| id | <- primary key
| time | <- DateTime
| row2 | <- varchar
| row3 |
| ... |
+-----------+
我想删除所有条目,除了一个,它们在一整小时的时间范围内并且具有相同的 row2 值(不同的 row2)。是否可以在没有存储过程和/或非 sql 代码的情况下执行此操作?
此问题的通常解决方案是首先查找要保留的行,然后删除所有其他行。第一部分可以通过聚合和分组来完成:
然后你可以写你的
DELETE
:这个主题有一些变化:您可以使用
NOT EXISTS
构造代替NOT IN
(进行适当的更改),或使用USING
关键字连接。早在 2011 年 2 月 22 日,我回答了一个关于使用 WHERE 子句针对自身的 DELETE 查询的问题:(MySQL 子查询问题)。
这是一种更安全的方法:
这是实际的 SQL:
您可以按原样运行这些命令,也可以将它们放在存储过程中。
虽然我给dezso 的答案一个 +1,因为它在 Oracle、PostgreSQL 和 SQL Server 中机械地工作,从 MySQL DBA 中获取,但我不相信MySQL在对自己的表执行 DELETE 时通过转换来优化内部 SQL 的方法。这就是我提交此答案的原因。