Mysql 怎么去重啊?

2016-02-28 09:14:28 +08:00
 onice

本人搞到了学校的学籍信息。源文件是 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 的记录都会被删掉,我想保留一条记录啊。

请指教。

1621 次点击
所在节点    数据库
13 条回复
liuhaotian
2016-02-28 09:20:03 +08:00
有两个思路,手机没法写完整了
一个是 LIMIT ( select count )-1
一个是 where id<( select id ORDER BY id DESC LIMIT 1 )
Neveroldmilk
2016-02-28 09:28:06 +08:00
笨办法是建立一个临时表,存储原始信息(去除冗余信息可以用 group by 命令),然后删除原表所有重复记录,最后把临时表信息插回去。
codingadog
2016-02-28 09:37:04 +08:00
Distinct, not distinct
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
2016-02-28 09:58:19 +08:00
@ligyxy nice
@Neveroldmilk 之前面试问到了,我也就只知道临时表的办法
est
2016-02-28 10:27:39 +08:00
新建表,然后把数据 insert ignore 过去
soulgeek
2016-02-28 10:34:20 +08:00
alter ignore table *** add unique index
建唯一索引,重复的会保留一条记录;要有 ignore 标志,否则会提示重复
ianisme
2016-02-28 11:08:38 +08:00
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
2016-02-28 11:28:05 +08:00
@ianisme 你 group by comment_date 会不会漏数据?
zrp1994
2016-02-28 12:58:43 +08:00
partition over 语句
fy
2016-02-28 13:43:07 +08:00
楼主啊 这种一次性的工作,完成了就行,手段优雅不优雅,根本不在乎的。
用最耿直最朴实最简单最慢的办法就行了。
ianisme
2016-02-28 20:50:14 +08:00
不会漏数据的
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 就行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/259588

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX