精华内容
下载资源
问答
  • 主要介绍了mysql查找删除重复数据并只保留一条实例详解的相关资料,需要的朋友可以参考下
  • 想去重name值并且保留ID最大的记录 //查询 查看是否是需要删除的记录 SELECT * FROM test where id not in ( SELECT id from (SELECT MAX(id) id FROM test GROUP BY name) a ); //删除对应的记录 DELETE FROM ...

    数据如下
    在这里插入图片描述
    目的:去重name值并且保留ID最大的记录

    //查询 查看是否是需要删除的记录
    SELECT *
    FROM  test  where id not in (
    	SELECT id from (SELECT MAX(id) id FROM test GROUP BY name) a
    );
    
    //删除对应的记录
    DELETE 
    FROM  test  where id not in (
    	SELECT id from (SELECT MAX(id) id FROM test GROUP BY name) a
    );
    

    如果mysql大于5.7版本
    可能会报错

    SELECT id from (SELECT name,id FROM test GROUP BY name HAVING count(1)>1) a
    > 1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘test.test.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

    需要修改my.ini 去掉sql_model 中 only_full_group_by

    展开全文
  • 假设种情况,数据库的数据重复了,但是又不想随便去除个。 比如,书库中《三体》录入了多次,想根据时间戳,只保留次入库的记录,也就是张三录入的记录。 分析 想要删除重复数据,需要找出不合适的数据,...
    前提

    假设一种情况,数据库的数据重复了,只想保留最早一条。
    比如,书库中《三体》录入了多次,想根据时间戳,只保留第一次入库的记录,也就是张三录入的记录。


    在这里插入图片描述

    分析

    想要删除重复数据,需要找出不合适的数据,根据主键(s_id)删除掉。具体是以下两步:

    1. 找出想保留数据的id
    2. 把其他的数据删除
    实现
    1、找出想保留数据的id,这一步是最关键的一步

    如果数据是自增长的,就比较简单,只需要一句

    SELECT min(s_id) id from t_book GROUP BY s_name
    

    到此可以直接看第二步了。
    但是如果id是uuid就会变得复杂,需要根据时间排序拿到第一条数据

    SELECT min(d_timestamp) time,s_name FROM t_book GROUP BY s_name
    

    这样我们就拿到了同一本书最早的记录,但是缺少id。


    在这里插入图片描述

    注意:这里不能把 id 直接写在SELECT 中,因为 id 不在GROUP BY后面。如果是 mysql8,强行添加在SELECT 就会报错,需要用 any_value(s_id) 处理,mysql5+ 虽然不会报错,但是和这个方法一样,从字面也能看出来,any_value 就是随便一个值,这样强行放置的结果就是拿到的数据id并不符合 min(d_timestamp) 这个条件。

    想要拿到 id,需要再关联原始表。

    SELECT t_left.s_name,t_right.s_id,t_right.s_name,t_right.d_timestamp
    FROM (SELECT min(d_timestamp) time,s_name FROM t_book GROUP BY s_name) t_left LEFT JOIN t_book t_right  
    ON t_left.time=t_right.d_timestamp AND t_left.s_name=t_right.s_name
    

    关联结果:


    在这里插入图片描述

    这样就拿到了需要保留数据的 id。

    2、把其他的数据删除

    拿到了需要保留的 id ,就只需要通过 not in 语句删除不在这些 id 里面的数据就行了。一般就会写成如下这种,但是是会报错的

    DELETE FROM t_book WHERE s_id not in (
    SELECT t_right.s_id
    FROM (SELECT min(d_timestamp) time,s_name FROM t_book GROUP BY s_name) t_left LEFT JOIN t_book t_right  
    ON t_left.time=t_right.d_timestamp AND t_left.s_name=t_right.s_name
    ) 
    

    错误信息如下,就是说不能直接操作原表数据

    1093 - You can’t specify target table ‘t_book’ for update in FROM clause

    解决方法是将当前表重新命名成一个独立的表 t_all,然后从 t_all 里面查询出来 id

    SELECT id FROM 
    (SELECT t_right.s_id id
    FROM (SELECT min(d_timestamp) time,s_name FROM t_book GROUP BY s_name) t_left LEFT JOIN t_book t_right  ON t_left.time=t_right.d_timestamp AND t_left.s_name=t_right.s_name) 
    t_all
    

    最终的语句就是

    DELETE FROM t_book WHERE s_id not in (
    SELECT id FROM 
    (SELECT t_right.s_id id
    FROM (SELECT min(d_timestamp) time,s_name FROM t_book GROUP BY s_name) t_left LEFT JOIN t_book t_right  ON t_left.time=t_right.d_timestamp AND t_left.s_name=t_right.s_name) 
    t_all
    )
    

    执行成功


    在这里插入图片描述

    展开全文
  • NULL 博文链接:https://onestopweb.iteye.com/blog/2318954
  • mysqlmysql删除重复记录并且只保留一条

    万次阅读 多人点赞 2018-09-03 21:10:13
    目录 、单个字段的操作 分组介绍: 1. 查询全部重复的数据: 2. 删除全部重复试题: ...4. 删除表中多余重复试题并且只留1: a. 第种方法: b. ☆第二种方法(与上面查询的第二种方法对应,只...

    目录

    一、单个字段的操作

    分组介绍:

    1. 查询全部重复的数据:

    2. 删除全部重复试题:

    3. 查询表中多余重复试题(根据depno来判断,除了rowid最小的一个)

    a. 第一种方法:

    b. 第二种方法:

    c. 补充第三种方法(根据评论区给的删除总结出来的):

    4. 删除表中多余重复试题并且只留1条:

    a. 第一种方法:

    b. ☆第二种方法(与上面查询的第二种方法对应,只是将select改为delete):

    c. 补充第三种方法(评论区推荐的一种方法):

    二、多个字段的操作:

    总结:


    最近在做题库系统,由于在题库中添加了重复的试题,所以需要查询出重复的试题,并且删除掉重复的试题只保留其中1条,以保证考试的时候抽不到重复的题。

    首先写了一个小的例子:

    一、单个字段的操作

    这是数据库中的表:

    分组介绍:

    Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1

    查看是否有重复的数据:

    GROUP BY <列名序列>

    HAVING <组条件表达式>

    查询出:根据dname分组,同时满足having字句中组条件表达式(重复次数大于1)的那些组

    count(*)与count(1) 其实没有什么差别,用哪个都可以

    count(*)与count(列名)的区别:

        count(*)将返回表格中所有存在的行的总数包括值为null的行,然而count(列名)将返回表格中除去null以外的所有行的总数(有默认值的列也会被计入)

    1. 查询全部重复的数据:

    Select * From 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1)
    

    2. 删除全部重复试题:

    将上面的查询select改为delete(这样会出错的)

    DELETE
    FROM
    	dept
    WHERE
    	dname IN (
    		SELECT
    			dname
    		FROM
    			dept
    		GROUP BY
    			dname
    		HAVING
    			count(1) > 1
    	)

    会出现如下错误:[Err] 1093 - You can't specify target table 'dept' for update in FROM clause

    原因是:更新这个表的同时又查询了这个表,查询这个表的同时又去更新了这个表,可以理解为死锁。mysql不支持这种更新查询同一张表的操作

    解决办法:把要更新的几列数据查询出来做为一个第三方表,然后筛选更新。

     

    3. 查询表中多余重复试题(根据depno来判断,除了rowid最小的一个)

    a. 第一种方法:

    SELECT
    	*
    FROM
    	dept
    WHERE
    	dname IN (
    		SELECT
    			dname
    		FROM
    			dept
    		GROUP BY
    			dname
    		HAVING
    			COUNT(1) > 1
    	)
    AND deptno NOT IN (
    	SELECT
    		MIN(deptno)
    	FROM
    		dept
    	GROUP BY
    		dname
    	HAVING
    		COUNT(1) > 1
    )

    上面这种写法正确,但是查询的速度太慢,可以试一下下面这种方法:

    b. 第二种方法:

    根据dname分组,查找出deptno最小的。然后再查找deptno不包含刚才查出来的。这样就查询出了所有的重复数据(除了deptno最小的那行)

    SELECT *
    FROM
    	dept
    WHERE
    	deptno NOT IN (
    		SELECT
    			dt.minno
    		FROM
    			(
    				SELECT
    					MIN(deptno) AS minno
    				FROM
    					dept
    				GROUP BY
    					dname
    			) dt
    	)

    c. 补充第三种方法(根据评论区给的删除总结出来的):

    SELECT
    	* 
    FROM
    	table_name AS ta 
    WHERE
    	ta.唯一键 <> ( SELECT max( tb.唯一键 ) FROM table_name AS tb WHERE ta.判断重复的列 = tb.判断重复的列 );

     

    4. 删除表中多余重复试题并且只留1条:

    a. 第一种方法:

    DELETE
    FROM
    	dept
    WHERE
    	dname IN (
    		SELECT
    			t.dname
    		FROM
    			(
    				SELECT
    					dname
    				FROM
    					dept
    				GROUP BY
    					dname
    				HAVING
    					count(1) > 1
    			) t
    	)
    AND deptno NOT IN (
    SELECT
    	dt.mindeptno
    FROM
    	(
    		SELECT
    			min(deptno) AS mindeptno
    		FROM
    			dept
    		GROUP BY
    			dname
    		HAVING
    			count(1) > 1
    	) dt
    )

    b. ☆第二种方法(与上面查询的第二种方法对应,只是将select改为delete):

    DELETE
    FROM
    	dept
    WHERE
    	deptno NOT IN (
    		SELECT
    			dt.minno
    		FROM
    			(
    				SELECT
    					MIN(deptno) AS minno
    				FROM
    					dept
    				GROUP BY
    					dname
    			) dt
    	)

    c. 补充第三种方法(评论区推荐的一种方法):

    DELETE 
    FROM
    	table_name AS ta 
    WHERE
    	ta.唯一键 <> (
    SELECT
    	t.maxid 
    FROM
    	( SELECT max( tb.唯一键 ) AS maxid FROM table_name AS tb WHERE ta.判断重复的列 = tb.判断重复的列 ) t 
    	);

    二、多个字段的操作:

    单个字段的如果会了,多个字段也非常简单。就是将group by 的字段增加为你想要的即可。

    此处只写一个,其他方法请仿照一个字段的写即可。

    DELETE
    FROM
    	dept
    WHERE
    	(dname, db_source) IN (
    		SELECT
    			t.dname,
    			t.db_source
    		FROM
    			(
    				SELECT
    					dname,
    					db_source
    				FROM
    					dept
    				GROUP BY
    					dname,
    					db_source
    				HAVING
    					count(1) > 1
    			) t
    	)
    AND deptno NOT IN (
    	SELECT
    		dt.mindeptno
    	FROM
    		(
    			SELECT
    				min(deptno) AS mindeptno
    			FROM
    				dept
    			GROUP BY
    				dname,
    				db_source
    			HAVING
    				count(1) > 1
    		) dt
    )

    总结:

    其实上面的方法还有很多需要优化的地方,如果数据量太大的话,执行起来很慢,可以考虑加优化一下:

    • 在经常查询的字段上加上索引
    • 将*改为你需要查询出来的字段,不要全部查询出来
    • 小表驱动大表用IN,大表驱动小表用EXISTS。IN适合的情况是外表数据量小的情况,而不是外表数据大的情况,因为IN会遍历外表的全部数据,假设a表100条,b表10000条那么遍历次数就是100*10000次,而exists则是执行100次去判断a表中的数据是否在b表中存在,它只执行了a.length次数。至于哪一个效率高是要看情况的,因为in是在内存中比较的,而exists则是进行数据库查询操作的

     

                                                                                                本人小菜一枚,有什么写的不妥的地方,欢迎大家指教!

                                                                                                我会不定期的看评论,也会根据大家的指点来修改博客不妥的地方!

                                                                                                各位读者有什么好的方法,或者想法欢迎评论区留言。。。

    展开全文
  • 没有主键,全字段去重,在不建立临时表的情况下可能做到吗???
  • mysql根据多字段删除重复的数据’ DELETE FROM 表名 WHERE ...这样我们就根据多字段删除重复的数据了,但是没有保留一条数据 DELETE FROM 表名 WHERE (字段1,字段2,字段3) IN (SELECT 字段1,字段2,字段3 FROM (S.

    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);
    

    这样我们就根据多字段删除重复的数据了,但是没有保留一条数据

    DELETE FROM 表名 WHERE (字段1,字段2,字段3)
    IN 
    (SELECT 字段1,字段2,字段3 FROM (SELECT 字段1,字段2,字段3 FROM 表名 GROUP BY 字段1,字段2 HAVING COUNT(*)>1) a1)
    AND
    id NOT IN (SELECT MIN(ID) FROM (SELECT ID FROM 表名 GROUP BY 字段1,字段2,字段3 HAVING COUNT(*)>1) a2);
    

    这样我们就根据多字段删除了重复的数据并且保留了一条数据

    展开全文
  • 查重是我们在工作中经常会遇到的一个需求,下面这篇文章主要给大家介绍了关于MySQL查询重复数据(删除重复数据保留id最小的一条为唯一数据)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有...
  • Mysql删除重复数据只保留一条,我的sql这样的 DELETE from t_patient WHERE pa_iid IN (select pa_iid from t_patient group by pa_vname having count(pa_vname)>1) 但是报错了: [Err] 1093 - You can't specify ...
  • 先按学号分组,分组后如果只有一条就不是重复,所以group 分组后必须用 having 过滤分组后的结果,对分组中条数大于1条才选中。 select * from student where sno in (select sno from student group by sno ...
  • mysql数据库删除重复的数据保留一条

    万次阅读 多人点赞 2019-07-09 22:15:13
    现在身份证号identity_id和姓名name有很多重复的数据,需要删除只保留一条有效数据。 2.模拟环境 1.等入mysql数据库,创建一个单独的测试数据库mysql_exercise create database mysql_exercise charset utf8; 2....
  • MySQL中删除重复数据只保留一条

    千次阅读 2016-12-21 15:22:41
    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢  1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 SELECT * FROM people ...
  • mysql根据两个字段判断重复的数据并且删除,只保留一条。以及MySQL统计重复数据,根据多条字段查询。
  • 数据库中存在重复记录,删除保留其中一条(是否重复判断基准为多个字段) 解决方案 碰到这个需求的时候,心里大概是有思路的。最快想到的是可以通过一条sql语句来解决,无奈自己对于复杂sql语句的道行太浅,所以想找...
  • **#例1:根据手机号customer_id查询所有重复的数据** SELECT * FROM aad_apply_main WHERE customer_id IN ( SELECT customer_id FROM aad_apply_main GROUP BY ...
  • 1,查出重复数据,现以card_number 重复就认定为重复 SELECT card_number FROM crm_def_customer GROUP BY card_number HAVING count(card_number) > 1) 2,查出最新的数据 SELECT max(create_date) FROM ...
  • mysql查找重复数据只保留一条记录

    万次阅读 2018-05-13 15:26:56
    比如我直接select * from movie where name="...有三条数据,但我只希望拿到其中任意一条就行了。可以使用group by 分组因为name是一样的,所以分组也就是只有一组,因此得到我想要的结果了。...
  • 考虑多语句变通的办法mysql> select * from x_user; +------+---------+-------------+ | id | name | mobile | +------+---------+-------------+ | 1 | yangfei | 15011186301 | | 1 | yangfei | 1501118630
  • MySQL删除重复数据只保留最新的一条

    千次阅读 2019-04-17 19:00:37
    MySQL删除重复数据并保留最新的一条,网上有些博客写的有问题,因为他们只考虑到或者说他们的重复数据最多只有两条,当重复数据大于2时,就会出现问题。 案例描述: 按天删除表中重复数据只保留最新的一条(这里...
  • device_code有重复的,我想要把这个表里面所有device_code重复的删除掉,保留一条,sql如下: DELETE FROM `ds_device` WHERE device_code IN (SELECT device_code FROM (SELECT device_code, COUNT(dev
  • Mysql重复数据去重保留一条数据

    千次阅读 2019-04-07 10:51:00
    重复的数据删除但是要保留一条 1、查找需要删除的数据 select * from poi where poi_id in ( select poi_id from poi group by poi_id having count (poi_id) > 1 ) and id not ...
  • 下图红框内为需要删除的重复数据,但是要保留article_id最大的那一条数据。 这里有7条重复数据,应该删掉6条,保留article_id=279142的记录 首先要有两个唯一标识: 一个所有数据里都不会重复的标识,如自增...
  • 1. select id from (select min(id) AS id from table group by code) a; 2. delete from tablewhere id not in (select id from (select min(id) AS id from table group by code) a)
  • 之前博客mysql数据库中删除重复的数据只保留一条中介绍的方法适用于有两条重复的数据 然后删除其中一条,保留一条,如果重复的数据较多(>2)时 就需要执行多次,重复的数据有3条 对应执行两次 依次类推,很显然...
  • 比如我的数据如下图所示,查询目的是查询出main重复的,并且保留main分组中score最大的一条数据,也参考了很多答案但是并不理想,后来在技术群里请教了一位大神 最后的sql贴出来: select id, main, score ...
  • 1、查询重复记录 SELECT * FROM 表名 WHERE 重复字段 IN (SELECT 重复字段 FROM 表名 ... 2、删除重复记录,但保留一条 DELETE FROM 表名 WHERE 重复字段 IN (SELECT 重复字段 FROM 表名 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,316
精华内容 16,526
关键字:

mysql去重复保留一条

mysql 订阅