Rubber Man

MYSQL 删掉重复行,保留唯一值


今天遇到这个问题,然后做出自己解决方法,其中有些问题值得记录。

原理:

a)建立一个相同结构的空表 b,然后存入有重复记录的name;

b)删掉原来表a 中有重复的记录,(记录在临时表 b),因为不能在自身select update同时运行

c)从临时表 b 取回记录。

步骤:

0.这里以最简单的单个字段“name”重复为例子,更加复杂的结果也是类似,只需要多价一个和 name 样的 条件。

1. 建立测试表

create table user_2 (

id int(11) primary key auto_increment,

name VARCHAR(20) not null default '',

key(name)

)

engine=myisam default charset=utf8;

2.存入测试数据

insert into user_2 (name)

values

('化学'),('体育'),('历史'),

('地理'),('语文'),('化学'),

('绘画'),('生物'),('物理'),

('绘画'),('体育'),('生物'),

('历史'),('物理'),('生物'),

('化学'),('英语'),('语文'),

('理科'),('化工'),('考古');

3. 相同name 的记录种数,7 ,这7类都有记录需要处理。

select id,name from user_2 group by name having count(name)>1

//用 group by 和having count(name) 一起 可以计算哪些,name 有重复

4.以 name 为单元的数目,12,那么我们最后的记录也应该是这12行

select id,name from user_2 group by name




5.建立一个和 测试表完全一样的表,并且存入有重复的“name”记录的数据 7条

create table user_2_tmp as (

select id,name from user_2 group by name having count(name)>1

)




6.删掉有 临时表,有记录的 name,也就是,删掉所有有重复的记录。

delete from user_2 where name in(

    select name from user_2_tmp

)



7.从 临时表,把唯一重复的记录,取回来

insert into user_2(name) select name from user_2_tmp



8. 验证数据 ,总共 12条,没有重复的记录,成功。。

select * from user_2

select * from user_2 group by name ;

结果和上面的没有 group by完全一致。




评论
© Canarium | Powered by LOFTER