[英]mysql delete from query using special id and date field
我拥有的是 tblSpecialTable 中的两列 specialid 和 date,我的表有重复的 specialID,我想从表中删除日期列是较旧的日期并且 specialid 重复的表。
看我的例子:
mysql> SELECT * FROM test;
+------+---------------------+
| id | d |
+------+---------------------+
| 1 | 2011-06-29 10:48:41 |
| 2 | 2011-06-29 10:48:44 |
| 3 | 2011-06-29 10:48:46 |
| 1 | 2011-06-29 10:48:52 |
| 2 | 2011-06-29 10:48:53 |
| 3 | 2011-06-29 10:48:55 |
+------+---------------------+
mysql> DELETE t1 FROM test t1 INNER JOIN test t2 ON t1.id = t2.id AND t1.d < t2.d;
Query OK, 3 rows affected (0.00 sec)
mysql> SELECT * FROM test;
+------+---------------------+
| id | d |
+------+---------------------+
| 1 | 2011-06-29 10:48:52 |
| 2 | 2011-06-29 10:48:53 |
| 3 | 2011-06-29 10:48:55 |
+------+---------------------+
您必须对来自另一个查询的字段组合使用“双管”匹配。
DELETE FROM tblSpecialTable
WHERE CONCAT(specialid, date) IN (
SELECT CONCAT(specialid, date)
FROM (
SELECT specialid, MAX(date) AS DATE, COUNT(*)
FROM tblSpecialTable
GROUP BY 1
HAVING COUNT(*) > 1) x
)
使用 tmp 表,设置 specialid 列是唯一的。 然后在下面使用 sql:插入 tmp(specailid,date) 值(从 tplSpecialTable 中选择 specialid,date 按日期 desc 顺序)
DELETE FROM tblSpecialTable
WHERE specialid NOT IN
(SELECT specialid FROM tblSpecialTable
GROUP BY specialid
HAVING COUNT(table.date) > 1
ORDER BY date
LIMIT COUNT(table.date) - 1 )
这不是一个花哨的单一查询,但它可以解决问题:
CREATE TABLE tmp as SELECT * FROM tblspecialtable ORDER BY date DESC;
DELETE FROM tblspecialtable WHERE 1;
INSERT INTO tblspecialtable SELECT * FROM tmp GROUP BY specialid;
DROP TABLE tmp;
第一行创建一个临时表,其中的值按日期排序,最近的在前。 第二个在原始表中为固定值腾出空间。 第三个合并了值,并且由于 GROUP BY 命令是从上到下的,因此它首先采用最新的。 最后一行删除了临时表。 最终结果是原始表,其中包含只有最近日期的 specialid 唯一值。
此外,如果您以编程方式访问 mysql 表,最好先检查 id 是否存在,然后使用 update 命令更改日期,或者如果没有现有的 specialID,则添加新行。 此外,如果您不想重复,您应该考虑将 specialID 设为 UNIQUE。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.