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