我將如何從 MySQL 表中洗掉昨天的重復資料并保留最新記錄。
例如,使用以下資料:
SELECT * FROM data;
| pid | serviceid | id | created
| ----| ----------|----------------|---------
| 10 | ABNCKN | Q0CHZ2GI1VKOPL | 2022-06-14 10:49:34
| 11 | ABNCKN | Q0CHZ2GI1VKOPL | 2022-06-14 10:49:34
| 12 | KSPSLS | QLSPDF0S0SDFKK | 2022-06-15 11:44:21
| 13 | AKNKSL | QLSPDF0S0SDFKK | 2022-06-15 12:51:42
| 14 | AKNKSL | QLSPDF0S0SDFKK | 2022-06-15 12:51:42
我用了
DELETE n1 FROM data n1, data n2 WHERE n1.pid < n2.pid AND n1.id = n2.id
我怎么能 DELETE 只洗掉重復項并為昨天的資料保留最新的 pid。
預期輸出為
SELECT * FROM data;
| pid | serviceid | id | created
| ----| ----------|----------------|---------
| 10 | ABNCKN | Q0CHZ2GI1VKOPL | 2022-06-14 10:49:34
| 11 | ABNCKN | Q0CHZ2GI1VKOPL | 2022-06-14 10:49:34
| 12 | KSPSLS | QLSPDF0S0SDFKK | 2022-06-15 11:44:21
| 14 | AKNKSL | QLSPDF0S0SDFKK | 2022-06-15 12:51:42
消除| 13 | AKNKSL | QLSPDF0S0SDFKK | 2022-06-15 12:51:42
uj5u.com熱心網友回復:
如果要洗掉重復資料,可以使用此
SELECT DISTINCT * FROM 資料;
但是如果你想從兩者中選擇最新的記錄,你可以使用這個
SELECT * FROM data WHERE [data] = (SELECT MAX([data.created]) FROM data) GO
uj5u.com熱心網友回復:
DELETE * FROM data WHERE id IN (SELECT id FROM data WHERE name="ABNCKN" LIMIT((SELECT COUNT(name) FROM data WHERE name="ABNCKN") - 1)));
SELECT id FROM data WHERE name="ABNCKN" >> 此查詢將獲取所有具有特定名稱的 id,limit 將限制回傳的行數。行數將根據除一行之外的重復行而動態變化。您可以將 ORDER BY 添加到查詢中以排列它們。
最后洗掉除一行之外的所有重復行。
我希望它運作良好
uj5u.com熱心網友回復:
不太明白為什么要在預期的輸出中保留一些重復的資料,但是您可以嘗試使用 JOIN 獲取最后一個 Id 并從 WHERE 中過濾它,因此不會被洗掉:
DELETE d1 FROM data d1, data d2
JOIN (SELECT MAX(pid) pid FROM data) d3
WHERE d1.pid != d3.pid AND d1.pid < d2.pid AND d1.id = d2.id;
uj5u.com熱心網友回復:
您可以使用自聯接實作此目的:
DELETE t1 FROM data t1
INNER JOIN data t2
WHERE t1.pid < t2.pid
AND t1.serviceid = t2.serviceid
AND t1.id = t2.id
AND t1.created = t2.created;
SELECT * FROM data;
看到這個db<>fiddle
對于 MySQL 8 ,您還可以使用以下方法實作此目的ROW_NUMBER():
WITH CTE AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY serviceid,id,created ORDER BY pid DESC) AS RN
FROM data
)
DELETE data
FROM data
JOIN CTE ON data.pid=CTE.pid
WHERE CTE.RN>1;
SELECT * FROM data;
檢查這個db<>fiddle
洗掉后的輸出:
| PID | 服務標識 | ID | 創建 |
|---|---|---|---|
| 11 | ABNCKN | Q0CHZ2GI1VKOPL | 2022-06-14 10:49:34 |
| 12 | KSPSLS | QLSPDF0S0SDFKK | 2022-06-15 11:44:21 |
| 14 | AKNKSL | QLSPDF0S0SDFKK | 2022-06-15 12:51:42 |
正如Nishant 提到的 pid 10 也應該被洗掉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/491967.html
上一篇:根據記錄值更改查詢
