› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
sw1962
V2EX  ›  MySQL

MYsql 去重复语句 分析

  •  
  •   sw1962 · Sep 30, 2016 · 4947 views
    This topic created in 3652 days ago, the information mentioned may be changed or developed.
    方法一

    delete from `xxx` where id in (select * from (SELECT min(id) FROM `xxx` group by mail having count(mail)>1) as a);
    这是百度文章里 提到的最多的的一条语句。 240W 的数据处理了 3 个多小时才删除了 19w 数据。

    方法二

    create table tmp_xxx select min(id) as id,mail,password from xxx group by mail,password;
    同样的 240w 数据去重不到两分钟就搞定了。( 160w spend 56s )



    这个方法二,语句,我的 table 是 xs,为什么以下代码会提示错误

    create xs tmp_xxx select min(id) as id,mail,password from xs group by mail,password;
    17 replies  •  2016-10-22 18:09:27 +08:00
    GGGG430
        1
    GGGG430  
       Sep 30, 2016
    where id in (select * 这条语句能执行?
    LaoK666
        2
    LaoK666  
       Sep 30, 2016
    create xs 是什么鬼…… 不应该是 create table 么……
    xss
        3
    xss  
       Sep 30, 2016
    这个我能笑一天....create table 是语句要求,tmp_xxx 才是表名.....你这应该写 create table xs 吧....
    2014CD2014
        4
    2014CD2014  
       Sep 30, 2016
    逗比么
    wudanyang
        5
    wudanyang  
       Sep 30, 2016
    无力吐槽
    coderluan
        6
    coderluan  
       Sep 30, 2016
    楼主还是确保之前的知识掌握了再往后看的好。
    phpdever
        7
    phpdever  
       Sep 30, 2016
    楼上的都错了,楼主这是 mysql 最新版的写法,哈哈哈哈哈哈
    ethancheung1990
        8
    ethancheung1990  
       Sep 30, 2016
    直接用 delete , in 语句用 left join 的方法来代替
    bwangel
        9
    bwangel  
       Sep 30, 2016
    @GGGG430

    这个语句是可以执行的,但是两个表不能是相同的表。如果相同的表会报这种错误:

    ERROR 1093 (HY000): You can't specify target table 'test' for update in FROM clause

    参考这里: https://dev.mysql.com/doc/refman/5.7/en/expressions.html

    关于谓词(predicate)的部分。
    ethancheung1990
        10
    ethancheung1990  
       Sep 30, 2016
    DELETE T FROM MYTABLE T LEFT JOIN (SELECT MAX(A.ID) AS ID FROM MYTABLE A GROUP BY A.MAIL) TT ON T.ID = TT.ID WHERE TT.ID IS NULL
    ethancheung1990
        11
    ethancheung1990  
       Sep 30, 2016
    这个是重复数据只保留一条的语句,如果只删除重复数据里面的一条数据,适当修改
    bwangel
        12
    bwangel  
       Sep 30, 2016
    @GGGG430

    闲着蛋疼,又做了一个 Delete SQL 语句的分析。
    petelin
        14
    petelin  
       Oct 1, 2016
    @ethancheung1990 你这是错的啊,楼主第一种方法只能删除重复里最小的,你这个直接把不重复的也删掉了
    ethancheung1990
        15
    ethancheung1990  
       Oct 12, 2016
    @petelin 我这是把重复的删除来只剩一条,不重复的没有删掉 你可以试试。。。
    ethancheung1990
        16
    ethancheung1990  
       Oct 12, 2016
    @petelin 如果要按照楼主第一种的需求来删除 那就是
    DELETE T FROM MYTABLE T LEFT JOIN (SELECT MIN(A.ID) AS ID FROM MYTABLE A GROUP BY A.MAIL HAVING COUNT(A.MAIL) > 1) TT ON T.ID = TT.ID WHERE TT.ID IS NOT NULL
    两种需求,一种是只保留一条不重复数据,另一种是删除重复数据中的一条,两种都并没有删除非重复的数据
    mingyun
        17
    mingyun  
       Oct 22, 2016
    @ethancheung1990 厉害了我的哥
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4587 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 05:48 · PVG 13:48 · LAX 22:48 · JFK 01:48
    ♥ Do have faith in what you're doing.