› 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 · 5071 views
    This topic created in 3697 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
    GGGG430
    Sep 30, 2016
    1
    where id in (select * 这条语句能执行?
    LaoK666
    LaoK666
    Sep 30, 2016
    2
    create xs 是什么鬼…… 不应该是 create table 么……
    xss
    xss
    Sep 30, 2016
    3
    这个我能笑一天....create table 是语句要求,tmp_xxx 才是表名.....你这应该写 create table xs 吧....
    2014CD2014
    2014CD2014
    Sep 30, 2016
    4
    逗比么
    wudanyang
    wudanyang
    Sep 30, 2016
    5
    无力吐槽
    coderluan
    coderluan
    Sep 30, 2016
    6
    楼主还是确保之前的知识掌握了再往后看的好。
    phpdever
    phpdever
    Sep 30, 2016
    7
    楼上的都错了,楼主这是 mysql 最新版的写法,哈哈哈哈哈哈
    ethancheung1990
    ethancheung1990
    Sep 30, 2016
    8
    直接用 delete , in 语句用 left join 的方法来代替
    bwangel
    bwangel
    Sep 30, 2016
    9
    @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
    ethancheung1990
    Sep 30, 2016
    10
    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
    ethancheung1990
    Sep 30, 2016
    11
    这个是重复数据只保留一条的语句,如果只删除重复数据里面的一条数据,适当修改
    bwangel
    bwangel
    Sep 30, 2016
    12
    @GGGG430

    闲着蛋疼,又做了一个 Delete SQL 语句的分析。
    petelin
    petelin
    Oct 1, 2016
    14
    @ethancheung1990 你这是错的啊,楼主第一种方法只能删除重复里最小的,你这个直接把不重复的也删掉了
    ethancheung1990
    ethancheung1990
    Oct 12, 2016
    15
    @petelin 我这是把重复的删除来只剩一条,不重复的没有删掉 你可以试试。。。
    ethancheung1990
    ethancheung1990
    Oct 12, 2016
    16
    @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
    mingyun
    Oct 22, 2016
    17
    @ethancheung1990 厉害了我的哥
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1892 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 11:55 · PVG 19:55 · LAX 03:55 · JFK 06:55
    ♥ Do have faith in what you're doing.