V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
onice
V2EX  ›  数据库

Mysql 怎么去重啊?

  •  
  •   onice · 2016-02-28 09:14:28 +08:00 · 1620 次点击
    这是一个创建于 3184 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人搞到了学校的学籍信息。源文件是 VF 的数据表文件,我通过软件把这些文件导入到 Mysql 里面去的。

    可能是有的数据表文件重复导入了,在我给数据表的学号和考生号字段做主键的时候,提示值重复。

    请教 Mysql 的去重方法。

    数据表结构前三个字段是:
    考生号(KSH),学号(XH),姓名(XM)

    能做主键的只有考生号和学号,但现在这张表没有主键,考生号和学号有重复记录。

    我目前的思路是:

    //查询重复的考生号
    select KSH from tableName group by KSH having count(KSH) > 1
    //删除重复的记录
    delete from tableName where (select KSH from tableName group by KSH having count(KSH) > 1)

    但是这样,会把所有的重复记录都删掉。例如我查询出来考生号 001 重复了,如果以考生号 001 作为删除条件的话,整张表的考生号 001 的记录都会被删掉,我想保留一条记录啊。

    请指教。

    13 条回复    2016-03-31 15:03:51 +08:00
    liuhaotian
        1
    liuhaotian  
       2016-02-28 09:20:03 +08:00 via iPhone
    有两个思路,手机没法写完整了
    一个是 LIMIT ( select count )-1
    一个是 where id<( select id ORDER BY id DESC LIMIT 1 )
    Neveroldmilk
        2
    Neveroldmilk  
       2016-02-28 09:28:06 +08:00
    笨办法是建立一个临时表,存储原始信息(去除冗余信息可以用 group by 命令),然后删除原表所有重复记录,最后把临时表信息插回去。
    codingadog
        3
    codingadog  
       2016-02-28 09:37:04 +08:00 via iPad
    Distinct, not distinct
    ligyxy
        4
    ligyxy  
       2016-02-28 09:37:30 +08:00
    如果有 id 的话
    SELECT * FROM table LEFT JOIN (SELECT min(id) AS id, KSH FROM table GROUP BY KSH) AS t2 ON t2.id = table.id WHERE t2.id IS NULL;
    zonghua
        5
    zonghua  
       2016-02-28 09:58:19 +08:00 via iPhone
    @ligyxy nice
    @Neveroldmilk 之前面试问到了,我也就只知道临时表的办法
    est
        6
    est  
       2016-02-28 10:27:39 +08:00
    新建表,然后把数据 insert ignore 过去
    soulgeek
        7
    soulgeek  
       2016-02-28 10:34:20 +08:00
    alter ignore table *** add unique index
    建唯一索引,重复的会保留一条记录;要有 ignore 标志,否则会提示重复
    ianisme
        8
    ianisme  
       2016-02-28 11:08:38 +08:00   ❤️ 1
    create table tmp as select min(comment_ID) as col1 from wp_comments group by comment_date;
    delete from wp_comments where comment_ID not in (select col1 from tmp);
    drop table tmp;
    这是我在清除 wordpress 重复评论时候写的语句,你可以借鉴下
    http://www.ianisme.com/it/1998.html
    magzza
        9
    magzza  
       2016-02-28 11:28:05 +08:00
    @ianisme 你 group by comment_date 会不会漏数据?
    zrp1994
        10
    zrp1994  
       2016-02-28 12:58:43 +08:00 via iPhone
    partition over 语句
    fy
        11
    fy  
       2016-02-28 13:43:07 +08:00
    楼主啊 这种一次性的工作,完成了就行,手段优雅不优雅,根本不在乎的。
    用最耿直最朴实最简单最慢的办法就行了。
    ianisme
        12
    ianisme  
       2016-02-28 20:50:14 +08:00
    不会漏数据的
    domty
        13
    domty  
       2016-03-31 15:03:51 +08:00
    ```SQL

    SELECT
    *
    FROM
    tableName
    WHERE
    XH IN (
    SELECT
    XH
    FROM
    tableName
    GROUP BY
    KSH
    HAVING
    count(KSH) > 1
    )
    AND XH NOT IN (
    SELECT
    max(XH)
    FROM
    tableName
    GROUP BY
    KSH
    HAVING
    count(KSH) > 1
    )
    ORDER BY
    KSH

    ```

    这个是查询所有重复考生号的结果集,同时剔除相同考生号中学号最大的情况。
    你可以试试,如果删除的话你把 select * from 改成 delete from 就行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1940 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 102ms · UTC 00:36 · PVG 08:36 · LAX 16:36 · JFK 19:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.