本人搞到了学校的学籍信息。源文件是 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 的记录都会被删掉,我想保留一条记录啊。
请指教。
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 ) |
2
Neveroldmilk 2016-02-28 09:28:06 +08:00
笨办法是建立一个临时表,存储原始信息(去除冗余信息可以用 group by 命令),然后删除原表所有重复记录,最后把临时表信息插回去。
|
3
codingadog 2016-02-28 09:37:04 +08:00 via iPad
Distinct, not distinct
|
4
ligyxy 2016-02-28 09:37:30 +08:00
|
5
zonghua 2016-02-28 09:58:19 +08:00 via iPhone
|
6
est 2016-02-28 10:27:39 +08:00
新建表,然后把数据 insert ignore 过去
|
7
soulgeek 2016-02-28 10:34:20 +08:00
alter ignore table *** add unique index
建唯一索引,重复的会保留一条记录;要有 ignore 标志,否则会提示重复 |
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 |
10
zrp1994 2016-02-28 12:58:43 +08:00 via iPhone
partition over 语句
|
11
fy 2016-02-28 13:43:07 +08:00
楼主啊 这种一次性的工作,完成了就行,手段优雅不优雅,根本不在乎的。
用最耿直最朴实最简单最慢的办法就行了。 |
12
ianisme 2016-02-28 20:50:14 +08:00
不会漏数据的
|
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 就行了 |