zoukankan      html  css  js  c++  java
  • MySQL数据库根据一个或多个字段查询重复数据

      系统在开发测试过程中出现bug,比如并发操作没有处理好,数据库中往往会插入重复数据,这些脏数据经常会导致各种问题。bug可以修改,但是数据往往也要处理,处理SQL如下:

      1、根据一个字段查找重复数据

      比如,User表中的userName需要保持唯一,查询重复数据的语句如下:

    SELECT userName from `User` GROUP BY userName HAVING count(*) > 1;

      如果要删除重复数据,则根据userName分组获取最大或最小id,然后删除其他数据即可,如下:

    DELETE FROM USER WHERE userId NOT IN ( SELECT MAX( userId ) AS maxid FROM `User` GROUP BY userName);

      

      2、根据多个字段查找重复数据

      比如,User表中的userName、loginType需要保持数据的唯一性,查询重复数据的语句如下:

    SELECT * FROM `User` GROUP BY userName,loginType HAVING count( * ) > 1

      如果要保证数据的唯一性,则分组后查找最大或最小id然后删除其他数据,如下:

    DELETE FROM USER WHERE userId NOT IN ( SELECT MAX( userId ) AS maxid FROM `User` GROUP BY userName,loginType );

      另外还有一种方法,就是用CONCAT函数把多个字段串联然后查找出需要保留的id,其他数据删除即可,查询语句如下:

    SELECT nameAndType from (SELECT CONCAT(userName,loginType) as nameAndType from User) tt GROUP BY nameAndType HAVING count(nameAndType) > 1;

      删除语句如下:

    DELETE FROM USER WHERE userId NOT IN (SELECT maxid from (SELECT MAX(userId) as maxid, CONCAT(userName,loginType) as nameAndType from User GROUP BY nameAndType) t);

      

      以上就是楼主的解决办法,只求解决问题,没有进行SQL优化,希望可以能对大家有所帮助。

  • 相关阅读:
    BZOJ 1996: [Hnoi2010]chorus 合唱队
    BZOJ 2431: [HAOI2009]逆序对数列
    BZOJ1013: [JSOI2008]球形空间产生器sphere
    BZOJ 4196: [Noi2015]软件包管理器
    BZOJ 3670: [Noi2014]动物园
    NOIP 2017 提高组 day1t2 时间复杂度
    loj #6278. 数列分块入门 2
    CF285 E Positions in Permutations——“恰好->大于”的容斥和允许“随意放”的dp
    洛谷 1969 积木大赛——水题
    洛谷 1965 转圈游戏——水题
  • 原文地址:https://www.cnblogs.com/JohanChan/p/12156444.html
Copyright © 2011-2022 走看看