精华内容
下载资源
问答
  • 查重是我们在工作中经常会遇到的一个需求,下面这篇文章主要给大家介绍了关于MySQL查询重复数据(删除重复数据保留id最小的一条为唯一数据)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有...
  • 【mysql】mysql删除重复记录并且只保留一条

    万次阅读 多人点赞 2018-09-03 21:10:13
    2. 删除全部重复试题: 3. 查询表中多余重复试题(根据depno来判断,除了rowid最小的一个) a. 第一种方法: b. 第二种方法: c. 补充第三种方法(根据评论区给的删除总结出来的): 4. 删除表中多余重复试题...

    目录

    一、单个字段的操作

    分组介绍:

    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则是进行数据库查询操作的

     

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

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

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

    展开全文
  • DELETE FROM  e_shops_hz_xs WHERE  id NOT IN (    SELECT  a.id AS id  FROM  (  SELECT  MIN(id) AS id  FROM  e_shops_hz_xs ...这边随机查出唯一的那个id,然后把多余的删除

    DELETE
    FROM
        e_shops_hz_xs
    WHERE
        id NOT IN (
            SELECT
                a.id AS id
            FROM
                (
                    SELECT
                        MIN(id) AS id
                    FROM
                        e_shops_hz_xs
                    GROUP BY
                        phone
                ) a

        )

     

    这边随机查出唯一的那个id,然后把多余的删除

    展开全文
  • MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据 目录导航: 开发背景: 实战: 表结构如下图所示: 操作: 总结: 回到顶部 开发背景:  最近在做一个批量数据导入到MySQL数据库的功能...

    MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据

     

    开发背景:

      最近在做一个批量数据导入到MySQL数据库的功能,从批量导入就可以知道,这样的数据在插入数据库之前是不会进行重复判断的,因此只有在全部数据导入进去以后在执行一条语句进行删除,保证数据唯一性。

    实战:

    表结构如下图所示:

    表明:brand

     

    操作:

    使用SQL语句查询重复的数据有哪些:

    SELECT * from brand WHERE brandName IN(
    select brandName from brand GROUP BY brandName HAVING COUNT(brandName)>1 #条件是数量大于1的重复数据
    )

    使用SQL删除多余的重复数据,并保留Id最小的一条唯一数据:

    注意点:

    错误SQL:DELETE FROM brand WHERE brandName IN (select brandName from brand GROUP BY brandName HAVING COUNT(brandName)>1) 
    AND Id NOT IN (select MIN(Id) from brand GROUP BY brandName HAVING COUNT(brandName)>1)

     

    提示: You can't specify target table 'brand' for update in FROM clause   不能为FROM子句中的更新指定目标表“brand”

    原因是:不能将直接查处来的数据当做删除数据的条件,我们应该先把查出来的数据新建一个临时表,然后再把临时表作为条件进行删除功能

    正确SQL写法:

     DELETE FROM brand WHERE brandName IN (SELECT brandName FROM (SELECT brandName FROM brand GROUP BY brandName HAVING COUNT(brandName)>1) e)
    AND Id NOT IN (SELECT Id FROM (SELECT MIN(Id) AS Id FROM brand GROUP BY brandName HAVING COUNT(brandName)>1) t)
    #查询显示重复的数据都是显示最前面的几条,因此不需要查询是否最小值

    结果如下图:

    总结:

             很多东西都是需要自己一步一步的去探究的,当然网上的建议也是非常宝贵的借鉴和资源,无论做什么开发我们都需要理解它的工作原理才能够更好的掌握它。

    原文地址https://www.cnblogs.com/Can-daydayup/p/10454336.html

    展开全文
  • 1、查询重复记录 SELECT * FROM 表名 WHERE 重复字段 IN (SELECT 重复字段 FROM 表名 ... 2、删除重复记录,但保留一条 DELETE FROM 表名 WHERE 重复字段 IN (SELECT 重复字段 FROM 表名 ...
    • 1、查询重复记录

    SELECT * 
    FROM 表名
    WHERE 重复字段 IN (SELECT 重复字段 
       FROM 表名
       GROUP BY 重复字段 HAVING COUNT(重复字段)>1);
    • 2、删除重复记录,但保留一条

    DELETE FROM 表名
    WHERE 重复字段 IN (SELECT 重复字段 
               FROM 表名
               GROUP BY 重复字段 HAVING COUNT(重复字段)>1)
          AND Id NOT IN (SELECT MIN(id) 
                         FROM 表名
                         GROUP BY 重复字段 HAVING COUNT(重复字段)>1);

    具体操作时,可以用如下结构,:

    delete from  table_name where col_name in (select col_name from
     (select col_name from table_name GROUP BY col_name having count(col_name)>1) 
    as temp)
    and id not in ( select id from
     (select max(id) as id from table_name GROUP BY col_name having count(col_name)>1)
    as temp2);

     

    然后添加唯一索引:

    ALTER TABLE table_name ADD UNIQUE INDEX `uniq_col` (`col_name`); 

    展开全文
  • MySQL 查询重复数据,删除重复数据保留id最小的一条作为唯一数据 目录导航: 开发背景: 实战: 表结构如下图所示: 操作: 总结: 回到顶部 开发背景:  最近在做一个批量数据导入到MySQL数据库的功能...
  • 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 ...
  • mysql 去除重复

    2013-03-18 00:33:44
    mysql 去除重复 Select中DISTINCT关键字的用法 单表的唯一查询用:distinct 多表的唯一查询用:group by 在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的...
  • 首先,需要两个字段,一个是唯一字段,另一个就是要重复的字段。如果就连ID都相同的话,就新增一个字段,存放自增的数据就行,为了达到所有的数据都有一个唯一的作用。 DELETE FROM 表名 WHERE 唯一的字段 NOT IN...
  • so 手动删除,呵呵 // 下面将以简单的例子来说明下如何处理这个 case 举个栗子以mysql数据库为例:在数据库中建立数据表 [prefix_]article // 冗余表现在aid这列上,部分值出现了重复 另外,主要是考虑到想在aid
  • 删除表中重复记录,只保留一条: delete from 表名 where 字段ID in (select * from (select max(字段ID) from 表名 group by 重复的字段 having count(重复的字段) > 1) as b); 实例:2.当想要为某一个...
  • Mysql删除重复记录,保留id最小的一条
  • delete from person where Id not in(select min(id)from (select *from person)c group by c.email) ...注意:mysql中,执行删除操作的表与查找的表需要不同,因此在删除的时候需要新建一个派生表进行查找操作  
  • 子查询是根据唯一性字段分组,SUBSTRING_INDEX和GROUP_CONCAT结合使用可以得到需要删除的主键ID,GROUP_CONCAT也可以进行排序,按照自己的需求来保留一条数据。 DELETE purchase_order_logistics FROM purchase_...
  • 最近在做题库系统,由于在题库中添加了重复的试题,所以需要查询出重复的试题,并且删除重复的试题只保留其中1条,以保证考试的时候抽不到重复的题。 首先写了一个小的例子: 一、单个字段的操作 这是数据库中...
  • mysql删除重复字段并保留一条
  • 开干: ...删除不是该唯一标识【id】的数据 delete from 【tablename】 where 【id】 not in( select 【bm.id】 from (select min(【id】]) as id from 【tablename】 group by 【inde...
  • DELETE FROM 表名 WHERE ID IN ( SELECT * FROM (SELECT MAX(ID) FROM 表名 ...注意事项:MSG为重复字段 ID一定要是 唯一字段 ,如果ID代表的重复字段 那么就删除了所有的数据,BE CARE 上面这句SQL:有一...
  • 问题描述 前两天小灰清理一张表的赃数据,需要删除重复数据,仅保留一条。于是,小灰写了一条删除重复数据的sql语句,但是执行之后,发现仍然有重复数据。经排查是重复数据中有null值引起的。
  • – 除了要保留的,其它全部删除 where car_id not in ( select id from ( – 重复数据取id最大一条,plate为判断唯一字段 select max(car_id) as id from biz_car_info group by plate having count() >1 UNION ...
  • 最近在做题库系统,由于在题库中添加了重复的试题,所以需要查询出重复的试题,并且删除重复的试题只保留其中1条,以保证考试的时候抽不到重复的题。首先写了一个小的例子:一、单个字段的操作这是数据库中的表:...
  • 偶尔遇到一张表里重复插入了了相同的数据,为了防止重复的数据,我们需要对历史数据进行清理(保留最新的一条),并且为字段加入唯一键。下面以pt_logistics_check(包裹验收表)为例,packageNo为包裹号,checkId为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,046
精华内容 10,418
关键字:

mysql删除重复保留唯一

mysql 订阅