最近在搞数据库输入查询重复去重功能,由于是多个数据库表,所以只能借助中间表来处理,在数据表合并后大约有80多w 条数据,用网上一些not in 或者 子查询等等速度非常慢,这里我介绍下我的方法。
先说下需求:
表 A 字段 (email,phone)
表B 字段 (email,phone)
最后通过导入excel的数据 和 A,B两个表中的数据进行比对去重,然后把结果插入表B.
处理方法:
1、 创建 表C (id,email,phone) id [int,自增,主键],把A表数据跟B表数据合并
insert into C (email,phone) select email,phone from A;
insert into C (email,phone) select email,phone from B;
2、 比如说按照手机号去重,创建临时表把C表中的数据ID小的保存下来,根据phone分组,为了效率更好可以在phone 上建立索引
create table tmp_tb_d as select min(id) as tmp_id from C group by phone;
这样我们就把较小的id的那条手机号保存下来了.
3、 关联tmp_tb_d 表把C表中的重复数据删除,同时把过滤后的数据插入到 目标 表 B
INSERT INTO B (email,phone) SELECT email,phone FROM C,tmp_tb_d where C.id=tmp_tb_d.tmp_id and c.id > [这个ID是在 复制表B数据到C后的最后一条ID,你也可以不这么操作,但前提是需要复制完表B后清空它]
这里前两步骤花费时间也就在 10秒钟,第三步差不多2-3分钟.
完成后,你可以查看下表B里面是否还有重复的,你会发现答案是 NO。
select count(1),phone from C group by phone having count(1) > 1 ;
好啦,到这里可以收工了.
对了,在把数据导入时借助Mysql的CVS功能,可以写语句处理,当你想查看CVS的分隔符时候,你可以再CVS文件上右键用记事本打开,你会发现大部分是 ','
[code]
Linux 导入功能
LOAD DATA INFILE '/home/test/dump/ip_location.csv'
INTO TABLE ip_location
CHARACTER SET utf8
FIELDS TERMINATED BY ',' ENCLOSED BY '"';
--CHARACTER SET :mysql字符集,一定要加上,免去乱码麻烦
--INTO TABLE :导入到哪个表
--FIELDS TERMINATED BY :以什么作为分割符
-- ENCLOSED BY :被什么包围
[/code]
[code]
Windows 导入功能,盘符、文件夹不要带汉字。
LOAD DATA INFILE "d:/insert_data.csv"
REPLACE INTO TABLE DEMO
CHARACTER SET gb2312
FIELDS TERMINATED BY "," ENCLOSED BY ""
LINES TERMINATED BY "\r\n";
--LINES TERMINATED BY:这个与linux不同,以什么作为一行的结尾。
[/code]
好了,介绍到这里,我的方法是这样的,不过不一定是最优秀的,各位友好的方法,可以给我回复一起探讨,谢谢观赏。

下一篇:iptables 的简单配置样本