mysql 删除表中多余的重复记录

===============================================html

 2019/7/16_第1次修改                       ccb_warlockmysql

 

===============================================sql

接着上一个话题(https://www.cnblogs.com/straycats/p/11198340.html),作完了表结构和表内容的备份后,接着就须要删除数据。数据库

然而在删除数据的过程当中发现,存在多条相同的业务数据记录到了数据库中(表现为,除了索引字段,其余全部字段的内容彻底一致)。这样就致使本来的线性增长趋势更明显,脏数据不只浪费了空间,更影响了查询的效率。spa

故仍是经过sql语句的处理还删除那些逻辑上重复的数据。code

 

daily_t表结构以下:htm

字段名 描述
TID 索引id
USER_ID 用户id
STATS_DATE 日期

 

查看要删除的重复记录(在删除数据前先作查询确认范围)

SELECT *
FROM daily_t WHERE  (USER_ID, STATS_DATE) IN ( SELECT *
       FROM   (SELECT   USER_ID, STATS_DATE
               FROM daily_t GROUP BY USER_ID, STATS_DATE
               HAVING   count(*) > 1) A) AND    TID NOT IN ( SELECT *
        FROM   (SELECT   min(TID) FROM daily_t GROUP BY USER_ID, STATS_DATE
                HAVING   count(*) > 1) B) ORDER BY USER_ID, STATS_DATE;

 

删除重复的记录(只留有索引最小的记录)

DELETE
FROM daily_t WHERE  (USER_ID, STATS_DATE) IN ( SELECT *
       FROM   (SELECT   USER_ID, STATS_DATE
               FROM daily_t GROUP BY USER_ID, STATS_DATE
               HAVING   count(*) > 1) A) AND    TID NOT IN ( SELECT *
        FROM   (SELECT   min(TID) FROM daily_t GROUP BY USER_ID, STATS_DATE
                HAVING   count(*) > 1) B);

 

PS.sql语句中之因此对子查询多嵌套了一层(select *)是为了规避mysql不支持在where中进行针对须要删除操做的表的子查询(1093-You can’t specify target table for update in FROM clause),由于多嵌套了一层(select *)后,子查询内操做的是两张临时表A、B,而不是daily_t。blog

相关文章
相关标签/搜索