我所拥有的是两列specialid和tblSpecialTable中的日期,我的表有重复的特殊ID,我想从表中删除日期列是旧日期和特殊ID重复的地方。
答案 0 :(得分:2)
参见我的例子:
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 |
+------+---------------------+
答案 1 :(得分:0)
您必须在其他查询的字段的组合上使用“双管”匹配。
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
)
答案 2 :(得分:0)
使用tmp表,设置specialid列是唯一的。然后使用下面的sql: 插入到tmp(specailid,date)值(从日期desc中选择specialid,日期从tplSpecialTable顺序)
答案 3 :(得分:0)
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 )
答案 4 :(得分:0)
这不是一个奇特的单一查询,但它可以解决问题:
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。