簡體   English   中英

mysql 使用特殊 id 和日期字段從查詢中刪除

[英]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 | 
+------+---------------------+

另請參閱http://dev.mysql.com/doc/refman/5.0/en/delete.html

您必須對來自另一個查詢的字段組合使用“雙管”匹配。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM