mysql使用特殊的id和日期字段从查询中删除

时间:2011-06-29 03:42:08

标签: mysql

我所拥有的是两列specialid和tblSpecialTable中的日期,我的表有重复的特殊ID,我想从表中删除日期列是旧日期和特殊ID重复的地方。

5 个答案:

答案 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 | 
+------+---------------------+

另见http://dev.mysql.com/doc/refman/5.0/en/delete.html

答案 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。