mysql 刪除重復數據


1在日常使用mysql中 前端頁面點擊次數過多 mysql就會容易產生冗余數據,那這些數據該怎么刪除呢

說下思路

查詢重復字段id 查詢重復字段最小id 刪除重復字段ID 保留最小ID

 查詢重復記錄這沒的說

SELECT 重復記錄字段 from 表 GROUP BY 重復記錄字段 HAVING COUNT(*)>1

查詢重復字段ID

例如

SELECT id FROM way_bills WHERE source_goods_id in (SELECT source_goods_id from way_bills GROUP BY source_goods_id HAVING COUNT(*)>1) 

查詢最小ID

SELECT MIN(id) from way_bills GROUP BY source_goods_id HAVING COUNT(*)>1

組合起來完整語句

DELETE
FROM
driver_route
WHERE
FIND_IN_SET(
id,
(
SELECT
GROUP_CONCAT( id )
FROM
(
SELECT
GROUP_CONCAT( id ) id
FROM
driver_route
GROUP BY
driver_id,
departure_province,
departure_city,
departure_county,
destination_province,
destination_city,
destination_county
HAVING
COUNT( * ) > 1
) t
)
)
AND id NOT IN (
SELECT
f.id
FROM
(
SELECT
min( id ) id
FROM
driver_route
GROUP BY
driver_id,
departure_province,
departure_city,
departure_county,
destination_province,
destination_city,
destination_county
HAVING
COUNT( * ) > 1
) f
)

ps

一定要給表起別名 否則你會給他不期而遇 

You can't specify target table '表名' for update in FROM clause

它的意思是說,不能先select出同一表中的某些值,再update這個表(在同一語句中),即不能依據某字段值做判斷再來更新某字段的值。

就拿最后一段代碼來說

SELECT
f.id 
FROM
(
SELECT
min( id ) id 
FROM
driver_route 
GROUP BY
driver_id,
departure_province,
departure_city,
departure_county,
destination_province,
destination_city,
destination_county 
HAVING
COUNT( * ) > 1 
) f 

當你不是刪除而是直接查詢的時候用 它:

SELECT
min( id ) id 
FROM
driver_route 
GROUP BY
driver_id,
departure_province,
departure_city,
departure_county,
destination_province,
destination_city,
destination_county 
HAVING
COUNT( * ) > 1 

也是可以的但是一旦刪除查詢,同時進行就會報錯


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM