精华内容
下载资源
问答
  • MySql删除部分字段重复数据

    千次阅读 2018-07-21 16:41:47
    问题:表部分字段重复,需要对部分字段重复数据,保留一条,其余删除。 1 张三 河北 12 河北唐山 2 李四 河南 20 河南郑州 3 王五 山西 10 山西太原 4 赵六 山东 31 山东济南 5 张三 河北 25...

    问题:表部分字段重复,需要对部分字段重复的数据,保留一条,其余删除。

    1    张三    河北    12    河北唐山
    2    李四    河南    20    河南郑州
    3    王五    山西    10    山西太原
    4    赵六    山东    31    山东济南
    5    张三    河北    25    河北邢台
    6    李四    山东    16    山东青岛
    7    王五    湖北    45    湖北武汉
    8    赵六    山东    49    山东菏泽
    9    张三    河北    55    河北秦皇岛

    需求:如图person表中姓名省份字段有重复数据,需要删除;

    第一步,查询下重复的数据:

    SELECT MIN(id) AS minId,MAX(id) AS maxId,`name`,province,COUNT(*)
    FROM person
    GROUP BY `name`, province
    HAVING COUNT(*) > 1;

    结果如下:

    第二步,将重复数据存储为一个临时表;

    CREATE TABLE person_temp (SELECT MIN(id),MAX(id),`name`,province,COUNT(*)
    FROM person
    GROUP BY `name`, province
    HAVING COUNT(*) > 1);

    第三步,查询出要删除的person表的数据id【因为重复的数据不止有2条,此处保留id最小的数据,删除id较大的数据;亦可以保留id最大的数据】;

    SELECT p.*
    FROM person p,person_temp pt 
    WHERE p.`name`=pt.`name` 
    AND p.province=pt.province 
    AND p.id != pt.minId;

    得到要删除的数据如下:

    第四步,执行删除

    DELETE FROM person 
    WHERE id 
    IN (
    		SELECT p.id
    		FROM person p,person_temp pt 
    		WHERE p.`name`=pt.`name` 
    		AND p.province=pt.province 
    		AND p.id != pt.minId
    );

    执行发现报错了,

    [SQL]DELETE FROM person 
    WHERE id IN (
    						SELECT p.id
    						FROM person p,person_temp pt 
    						WHERE p.`name`=pt.`name` 
    						AND p.province=pt.province 
    						AND p.id != pt.minId);
    [Err] 1093 - You can't specify target table 'person' for update in FROM clause

    You can't specify target table 'brand' for update in FROM clause

    意思就是:不能对同一个表(person)执行先查询在删除操作;

    这种操作在oracle数据库是没有问题的。替换方案就是先建一个临时表,再删除;

    创建临时表:

    CREATE TABLE person_id_temp(
    		SELECT p.id
    		FROM person p,person_temp pt 
    		WHERE p.`name`=pt.`name` 
    		AND p.province=pt.province 
    		AND p.id != pt.minId
    );

    执行删除:

    DELETE FROM person WHERE id IN (SELECT id FROM person_id_temp);

    最终数据如下:

    1    张三    河北    12    河北唐山
    2    李四    河南    20    河南郑州
    3    王五    山西    10    山西太原
    4    赵六    山东    31    山东济南
    6    李四    山东    16    山东青岛
    7    王五    湖北    45    湖北武汉

    展开全文
  • 删除这些重复的数据,我们找出这些数据的ID,在select语句里,添加id字段,使用max函数,可以得到重复数据最后面的id。 执行结果如图,得到重复数据的id为8和9。 这样我们就可以使用delete语句来删除这二个id的...
  • 场景一 单个字段重复数据查找 & 去重 我们要把上面这个表中 单个字段 account字段相同的数据找出来。 思路 分三步 简述: 第一步 要找出重复数据,我们首先想到的就是,既然是重复,那么数量就是大于 1...

    前文

     

    重复数据的情况分为两种:  

    单个字段 数据重复  

    多个字段 数据重复

    所以该篇的内容就是包括


    单个字段的重复数据查找  与 去重
    多个字段的重复数据查找  与 去重 

     

     

    正文

     

    示例  accountinfo 表数据如下:

     

    场景一   单个字段重复数据查找 & 去重

    我们要把上面这个表中 单个字段 account字段相同的数据找出来。

    思路 分三步 简述:

     

    第一步

    要找出重复数据,我们首先想到的就是,既然是重复,那么 数量就是大于 1  就算是重复。 那就是 count 函数 。

    因为我们要排查的是 单个 字段account ,那么就是需要按照 account 字段 维度 去分组。  那就是 group by 函数。

     

    那么我们第一步写出来的mysql 语句是:
     

     SELECT account ,COUNT(account) as count FROM accountinfo GROUP BY account;

    查询结果如下:

    第二步 

    没错,如我们所想,count大于1的即是 account为 A  和 B 的数据。

    那么我们稍作筛选,只把count大于1的数据的account  找出来。

     第二步,利用having 拼接筛选条件,写出来的mysql 语句是:

     SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1;
    

    查询结果如下:

     第三步

    重复的account数据 A B 都找出来了,接下来我们只需要把account为A 和 B 的其他数据都一起查询出来。

    那就是利用第二步查出来的数据做为子查询条件,使用 IN 函数。

    第三步写出来的mysql 语句是:

     SELECT * FROM  accountinfo WHERE account IN
     (
     SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1
     );
    

    查询结果如下:

    可以看到重复的数据都被我们筛选出来了。

     

    那么怎么去重呢? 也就是说,把重复的数据删掉。

    不,准确点应该说是,重复的数据都只留下一条即可,这才是去重。

    紧接着上面,毕竟去重的前提肯定是找重,上面我们已经实现找重了,所以紧接着进行去重。

    按照我们步骤三得到的图,就是我们需要删掉一条account为A的数据, 一条account为B的数据,去重结果图应该如下:

     

    思路也分三步简述:

    第一步

    删掉数据,我们一般选择接住主键来删除,所以我们考虑从id入手。

    再来看我们的重复数据:

     

    如果我们想在这些重复数据里面,每个都保留一条,如 account 为 A 中 id=10 的数据,  account 为B 中 id=20 的数据 ,那么第一步我们就得把这两条数据从上面的

    最终得到的数据 筛选出来,也就是按照 account分组,保留里面id最小的数据。使用 group by min 函数。

    所以去重我们第一步写出来的mysql 语句是:

    SELECT min(id) as id from (
    
    
     SELECT * FROM  accountinfo WHERE account IN
     (
     SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1
     ) 
     
     
     ) a GROUP BY a.account

    查询结果如下:

     

    第二步

    想要保留的数据已经找出来了,那么接下来就是从所有的重复数据里面 删掉 不为 我们保留的数据 即可 。
    那么就是找出我们需要删除的id, 使用 not in 函数。

    所以去重我们第二步写出来的mysql 语句是:

    SELECT t1.id FROM (
    
    SELECT id  FROM accountinfo WHERE account IN (  SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1) ) t1 
    
    WHERE t1.id NOT IN (
    
    
    SELECT min(id) AS id FROM (
    
    
     SELECT * FROM  accountinfo WHERE account IN
     (
     SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1
     ) 
     
     
     ) a GROUP BY a.account
    
    )

    查询的结果为:

    对这个sql语句稍作文字说明:

    第三步,删掉第二步找出来的数据即可,根据id删除。

    所以第三步写出来的mysql语句是:
     

    DELETE FROM accountinfo WHERE id IN (
    
    SELECT t1.id FROM (
    
    SELECT id  FROM accountinfo WHERE account IN (  SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1) ) t1 
    
    WHERE t1.id NOT IN (
    
    
    SELECT min(id) AS id FROM (
    
    
     SELECT * FROM  accountinfo WHERE account IN
     (
     SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1
     ) 
     
     
     ) a GROUP BY a.account
    
    )
    
    )
    

     

    执行结果如下图:

     

    场景二  多个字段重复数据查找 & 去重

     

     示例  accountinfo 表数据如下:

     

     想要去重,我们的首要想到的也是先把 重复数据 找出来。

    现在的重复定义是, account 和 deviceId 都相同的 时候,这种数据就是重复数据(也就是上图绿色框出来的就是同时多个字段都存在重复的数据)。

    思路简述:

    第一步

    因为有了文章上半部讲到的单个字段重复的数据查找思路,所以到这边应该更好理解了。

    同样, account 和 deviceId 都相同的重复数据就是指, 这种数据存在的数量 大于 2,那么就是存在重复了。

    我们还是使用到了 group by  函数 和 count 函数 和 having and  函数(因为需要同时满足两个字段条件,使用and)。

    第一步写出来的mysql语句是:

    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 

    查询出来的结果如下图:

    第二步

    一样 也是把第一步里的到的关键信息 account 和 deviceId做为子查询条件,从原表里把  account 和 deviceId 同时相同的数据都查找出来。

    第二步写出来的mysql语句是:

     

    SELECT t.* FROM  accountinfo t, (
    
    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 
    ) a 
    
    WHERE t.account=a.account AND t.deviceId=a.deviceId 

     

    查询结果如下图:

     

    可以看到重复的数据都被我们筛选出来了,这些数据里面就是包含 account 和 deviceId 同时都相同的数据!

     

    去重

    第一步

    思路一样,我们对于重复的数据每个只保留一条,那就是把这些涉及重复的数据每个都找出一条,也是根据id入手。

    也就是在account为 C 且 deviceId 为 C333  三条重复数据里面,保留 id最小的 等于30 这一条;

    account为D 且 deviceId 为 D444  二条重复数据里面,保留 id最小的 等于40 这一条.

     

    所以第一步我们先写出来的mysql语句为:
     

    SELECT min(id) as id FROM (
    
    SELECT t.* FROM  accountinfo t, (
    
    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 
    ) a 
    
    WHERE t.account=a.account AND t.deviceId=a.deviceId 
    
    )a  GROUP BY a.account,a.deviceId
    

    查询结果如下图:

     

     

    第二步

    就是从涉及重复数据里面,找出除了我们需要保留的id之外的那批id, 那就是需要我们执行删除的数据id。

    所以第二步我们先写出来的mysql语句为:

    SELECT t.* FROM  accountinfo t, (
    
    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 
    ) a 
    
    WHERE t.account=a.account AND t.deviceId=a.deviceId 
    
    ) b   WHERE b.id
    
    NOT IN (
    
    
    SELECT min(id) as id FROM (
    
    SELECT t.* FROM  accountinfo t, (
    
    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 
    ) a 
    
    WHERE t.account=a.account AND t.deviceId=a.deviceId 
    
    )a  GROUP BY a.account,a.deviceId
    
    )
    
    

    查询出来的结果为:
     

    那么最后删掉这些id的数据即可:

    DELETE FROM accountinfo WHERE id in (
    
    SELECT b.id  FROM  (  
    
    SELECT t.* FROM accountinfo  t, (
    
    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 
    ) a 
    
    WHERE t.account=a.account AND t.deviceId=a.deviceId 
    
    ) b   WHERE b.id
    
    NOT IN (
    
    
    SELECT min(id) as id FROM (
    
    SELECT t.* FROM  accountinfo t, (
    
    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 
    ) a 
    
    WHERE t.account=a.account AND t.deviceId=a.deviceId 
    
    )a  GROUP BY a.account,a.deviceId
    
    )
    
    )
    

    去重后结果为:

     

     

    该篇就到此吧。

     

     

    展开全文
  • 怎么用mysql删除某个字段重复数据 delete from tablename where id not in (select id from (select min(id) as id from tablename group by key) as b); delete from exam where age in (select age from ...

     

    怎么用mysql删除某个字段重复的数据

    delete from tablename where id not in (select id from (select min(id) as id from tablename group by key) as b);
    delete from exam where age in (select age from (select min(age)as age from exam group by name having count(*)>1)as b);
    – key是重复的字段

     

    转载于:https://www.cnblogs.com/phpisfirst/p/9792571.html

    展开全文
  • DELETE FROM online_supplier WHERE id NOT IN (SELECT a.id FROM(SELECT id,NAME FROM online_supplier GROUP BY NAME) a)
    DELETE FROM online_supplier WHERE id NOT IN 
    
    (
    SELECT a.id FROM(
    SELECT  id,NAME FROM online_supplier GROUP BY NAME
    ) a
    )
    展开全文
  • 一般大家也许会碰到这个问题,大家可以参考下,讲的比较详细
  • (SELECT 字段1,字段2,字段3 FROM (SELECT 字段1,字段2,字段3 FROM 表名 GROUP BY 字段1,字段2,字段3 HAVING COUNT(*)>1) s1) AND id NOT in (SELECT id FROM (SELECT id FROM 表名 GROUP...
  • 参考 : https://blog.csdn.net/n950814abc/article/details/82284838 https://www.cnblogs.com/liyue-sqsf/p/9076902.html 单个字段(CODE) DELETE FROM `TEST` WHERE `ID` IN( SELECT * FROM( S...
  • mysql 语句: DELETE FROM order_test WHERE ( name IN ( SELECT n.name FROM ( SELECT name FROM order_test GROUP BY name HAVING COUNT(name) > 1 ) n ) ) AND ( id NOT IN ( SELECT i.id F...
  • 现在表中有少量重复数据和大量非重复数据重复数据中,preference列和timestamp列不为空的这些,需要保留;preference列和timestamp列为空的这些需要删除,应该怎么办? 初学者,希望答案详细:) 感激不尽 +----...
  • mysql根据多字段删除重复数据’ DELETE FROM 表名 WHERE (字段1,字段2,字段3) IN (SELECT 字段1,字段2,字段3 FROM (SELECT 字段1,字段2,字段3 FROM 表名 GROUP BY 字段1,字段2 HAVING COUNT(*)>1) t1); ...
  • 表名 根据学号字段删除重复数据: 1.给每一行设置行序号 定义一个变量n,插入序号字段,每行n+1 ALTER TABLE test.表名 ADD 序号 int NULL; set @n=0; update test.表名 set 序号=@n:=@n+1; 2.汇总 学号 ...
  • mysql字段删除重复数据保留id最大的.txt
  • mysql删除某个字段重复数据

    千次阅读 2016-07-07 17:14:55
    做个笔记DELETE FROM tablename where id not in (select id from (select min(id) as id from tablename group by key) as b ) ;其中key是重复字段
  • 假设我们有表A 里面有字段 field 里面有很多重复数据。 现在需要查询当前字段重复的个数 mysql>select filed ,count(*) as total from A group by field having count(1)>1 那么having 的在group by 后面执行 取...
  • 没有主键,全字段去重,在不建立临时表的情况下可能做到吗???
  • 由于网络阻塞,高并发造成生产环境下数据库中的数据重复!!! #所有的去重是将表中多于的记录去重 只有一条的保留 多条重复记录的话只保留ID最小的一个 #userrecoder表的SQL去重 userrecoder学生使用记录表,多个字段,...
  • 一,对于部门表部门编号重复数据,进行相关操作 -- 先查看部门信息原表的数据 select * from t_dept; -- 查询出所有d_no有重复数据(没有重复的不显示,即104在表中只有一条,所以不显示) select * from t_...
  • 一段时间后发现添加了很多重复的关联记录,需要在数据库中删除;(为了避免再出现冗余的重复记录,添加时要增加验证是否是重复记录) 这里有几个点: 通过group by以及having count(*)>1 来查询到重复记录...
  • 原因是: MySql中不允许在Update/Delete中使用子查询引用操作目标表。 处理方法:使用别名 id not in a a里面存的是 minid 这样,在delete中就没查询目标表了,而是查询了a 通俗理解:爸爸能管儿子,不管孙子 ...
  • mysql数据库删除重复数据保留一条

    万次阅读 多人点赞 2019-07-09 22:15:13
    现在身份证号identity_id和姓名name有很多重复数据,需要删除只保留一条有效数据。 2.模拟环境 1.等入mysql数据库,创建一个单独的测试数据库mysql_exercise create database mysql_exercise charset utf8; 2....
  • (SELECT 字段1,字段2,字段3 FROM (SELECT 字段1,字段2,字段3 FROM 表名 GROUP BY 字段1,字段2,字段3 HAVING COUNT()>1) s1) AND id NOT IN (SELECT id FROM (SELECT id FROM 表名 GROUP BY 字段1,字...
  • 偶尔遇到一张表里重复插入了了相同的数据,为了防止重复数据,我们需要对历史数据进行清理(保留最新的一条),并且为字段加入唯一键。下面以pt_logistics_check(包裹验收表)为例,packageNo为包裹号,checkId为...
  • mysql根据两个字段判断重复的数据并且删除,只保留一条。以及MySQL统计重复数据,根据多条字段查询。
  • MYSQL 删除表中的重复数据

    万次阅读 2018-08-23 15:30:43
    test表中name字段信息有重复,想进行过滤删除重复数据 删除重复数据之后的预期结果(不考虑id):   方法一: 用 create ......select......group by ...... 先创建临时表tab,新表tab中的数据时从test表中分组...
  • 遇到个问题,一个表内两个字段应该加上unique约束,但没加导致出现重复数据,网上找到一条sql可以删掉重复数据,原sql是这样的: DELETE from test WHERE (mid,uid) in (SELECT mid,uid FROM test GROUP BY mid,uid...
  • 1.dept 表: ID NAME 100 ...dept表中, ID字段100出现3次, 101出现2次, 其余出现1次, 通过一句MySQL语句将ID字段重复值对应的记录删除, 只保留其中一条, 即: 100对应的记录需要删除2行, 10...
  • Mysql查询字段去除指定列重复数据

    千次阅读 2020-12-06 22:54:15
    Distinct关键字主要用来在SELECT查询记录中根据某指定字段的值去除重复记录 SELECT DISTINCT [字段名] FROM [表名] WHERE [检索条件字句] eg: select distinct name from user_info;
  • mysql根据某一字段去除重复数据

    千次阅读 2018-12-24 15:10:07
    删除表crawl_simple_poi_all_ids_copy1 中 poi_id字段重复数据 #=======sql1: DELETE FROM crawl_simple_poi_all_ids_ovr WHERE poi_id IN ( SELECT t.poi_id FROM ( SELECT poi_id FROM ...
  • MYSQL里有五百万数据,但大多是重复的,真实的就180万,于是想怎样把这些重复数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式,用这个方式,五...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,589
精华内容 44,635
关键字:

mysql删除字段重复数据

mysql 订阅