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