-
2021-03-26 14:11:16
在日常数据查询中,多有需要进行数据去重的查询,或删除重复数据的情况,以下罗列集中数据去重查询:
1、根据全部字段的去重查询:
select distinct * from table
2、根据某些字段的去重查询(不考虑查询其他字段)
select distinct c_name,c_year,c_month from table
或者:
select c_name,c_year,c_month from table group by c_name,c_year,c_month
3、根据某些字段的去重查询(考虑查询其他字段)
如果其他字段所有结果值都想保留,建议直接用group by 和group_concat即可
select c_name,c_year,c_month,group_concat(',') c_values from table group by c_name,c_year,c_month
4、根据某些字段的去重查询,查询重复项以外的全部数据
一般去重是根据时间、ID等,如时间最新/ID最大/value最大等等;
此处示例重复数据中ID小的是原始项,ID大的是重复项;
如果要看新的数据,则将以下的 min 改为 max ,也可根据自身情况调整其他字段。
select * from tableA where c_id in (select min(c_id) minid from tableA group by c_name,c_year,c_month )
或者:
select * from tableA where c_id not in (select min(c_id) minid from tableA group by c_name,c_year,c_month having count(*)>1 )
5、根据某些字段的去重查询,查询重复项(不包含原始项,只查询重复项)
select * from tableA where c_id not in (select min(c_id) minid from tableA group by c_name,c_year,c_month )
6、根据某些字段,查询出所有重复的数据(包含原始项和重复项)
select * from tableA a right join (select c_name,c_year,c_month from table A group by c_name,c_year,c_month having count(*)>1) b on a.c_name=b.c_name and a.c_year=b.c_year and a.c_month=b.c_month
7、根据某些字段,删除重复的数据(示例ID最小的是要保留的数据,其他都是不要的)
从思路上来讲,应该(实际上会出错):
delete from tableA where c_id not in (select min(c_id) minid from tableA group by c_name,c_year,c_month )
但是此时会报错: You can't specify target table for update in FROM clause
原因是:在同一张表,不能先查询某些值,再进行update操作
解决方法是:需要先把查询处理的id结果,as 一张表,再做delete操作,调整如下:
delete from tableA where c_id in ( select * from (select c_id from tableA where c_id not in (select min(c_id) from tableA group by c_name,c_year,c_month )) a )
或者:
delete from tableA where c_id in( select * from ( select c_id from tableA where c_id in (select max(c_id) from tableA group by c_name,c_year,c_month having count(*)>1 )) a )
以上就是几种去重的查询方法,可根据自身业务场景做调整。
更多相关内容 -
MySQL去重查询
2022-04-07 09:02:01在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录, 实例: select distinct name,id from user;,这样的结果为: distinct name,id 这样的mysql ...在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,
实例:
select distinct name,id from user;,这样的结果为:
distinct name,id 这样的mysql 会认为要过滤掉name和id两个字段都重复的记录,如果sql这样写:select id,distinct name from user,这样mysql会报错,因为distinct****必须放在要查询字段的开头。
所以一般distinct用来查询不重复记录的条数。
如果要查询不重复的记录,有时候可以用****group by :
select id,name from user group by name;
group by 是分组查询 关键字
distinct 是去重查询关键字
详情网站:http://www.cnblogs.com/shiluoliming/p/6604407.html
-
mysql 去重查询
2020-11-27 21:48:58<p>id aid bid cid ...我想根据cid去重查询该怎么写sql语句? <p>1 1 2 1 2 1 2 1 3 2 1 1 4 2 1 1 类似于这4条数据可以视为一条,该怎么写sql语句?</p> -
MySQL去重的方法整理
2020-09-09 15:53:21主要介绍了MySQL去重的方法整理的相关资料,需要的朋友可以参考下 -
一条sql语句完成MySQL去重留一
2020-12-16 09:06:37前几天在做一个需求的时候,需要清理mysql中重复的记录,当时的想法是通过代码遍历写出来,然后觉得太复杂,心里想着应该可以通过一个sql语句来解决问题的。查了资料,请教了大佬之后得出了一个很便利的sql语句,... -
MySQL去重查询只保留一条最新的记录
2022-02-20 04:36:34MySQL去重查询只保留一条最新的记录需求:MySQL去重查询只保留一条最新的记录
易错的写法
表结构与初始数据如下SQL文件:
-- MySQL dump 10.13 Distrib 8.0.28, for Linux (x86_64) -- -- Host: localhost Database: test01 -- ------------------------------------------------------ -- Server version 8.0.28-0ubuntu0.20.04.3 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!50503 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `MyClass` -- DROP TABLE IF EXISTS `MyClass`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `MyClass` ( `id` int NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL, `sex` int NOT NULL DEFAULT '0', `degree` double(16,2) DEFAULT NULL, `inserttime` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `MyClass` -- LOCK TABLES `MyClass` WRITE; /*!40000 ALTER TABLE `MyClass` DISABLE KEYS */; INSERT INTO `MyClass` VALUES (1,'Tom',0,96.45,'2022-02-19 18:00:00'),(2,'Joan',0,82.99,'2022-02-19 18:20:00'),(3,'Wang',0,96.59,'2022-02-19 18:30:00'),(4,'Tom',0,96.45,'2022-02-19 17:00:00'),(5,'Joan',0,82.99,'2022-02-19 18:25:00'),(6,'Wang',0,96.59,'2022-02-19 18:35:00'); /*!40000 ALTER TABLE `MyClass` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2022-02-20 4:35:15
SQL统计语句:
#全表扫描查询 SELECT * FROM test01.MyClass; #根据'name'分组统计查询最新一条数据 SELECT * FROM test01.MyClass WHERE name in (SELECT name FROM test01.MyClass GROUP BY name) AND inserttime in (SELECT max(inserttime) FROM test01.MyClass GROUP BY name);
全表扫描查询_结果:
根据’name’字段去重统计查询最新数据_结果:
正确的写法-1
--------------------------------------------错误纠正UPDATE Sun May 1 00:28:18 CST 2022
初始数据如下:
[{"id":1, "name":"Tom", "sex":0, "degree":96.45, "inserttime":"2022-02-19 18:00:00"}, {"id":2, "name":"Joan", "sex":0, "degree":82.99, "inserttime":"2022-02-19 18:20:00"}, {"id":3, "name":"Wang", "sex":0, "degree":96.59, "inserttime":"2022-02-19 18:00:00"}, {"id":4, "name":"Tom", "sex":0, "degree":96.45, "inserttime":"2022-02-19 17:00:00"}, {"id":5, "name":"Joan", "sex":0, "degree":82.99, "inserttime":"2022-02-19 18:00:00"}, {"id":6, "name":"Wang", "sex":0, "degree":96.59, "inserttime":"2022-02-19 18:35:00"}, {"id":7, "name":"Wang", "sex":0, "degree":90.0, "inserttime":"2022-02-19 18:36:00"}]
#全表扫描查询 SELECT * FROM test01.MyClass ORDER BY inserttime DESC; #根据'name'字段去重统计查询最新数据(错误的写法) #SELECT * FROM test01.MyClass #WHERE # name in (SELECT name FROM test01.MyClass GROUP BY name) # AND inserttime in (SELECT max(inserttime) FROM test01.MyClass GROUP BY name); #去重查询只保留一条最新的记录(正确的写法-1) SELECT classtab.* FROM (SELECT name, MAX(inserttime) inserttime FROM test01.MyClass GROUP BY name) tmp LEFT JOIN test01.MyClass classtab ON classtab.name = tmp.name AND classtab.inserttime = tmp.inserttime;
#全表扫描查询_结果:
#去重查询只保留一条最新的记录(正确的写法-1)_结果:
正确的写法-2
正确的写法-3
文末:若有错误请批评指正.
-
将MySQL去重操作优化到极致的操作方法
2020-12-16 05:21:54•问题提出 源表t_source结构如下: item_id int, created_time datetime, modified_time datetime, item_name varchar(20), other varchar(20) 要求: 1.源表中有100万条数据,其中...8G物理内存(MySQL配置4G) -
Mysql去重查询---DISTINCT、group by
2022-01-12 22:51:25age重复的数据,只保留id最小的,其余删除 DELETE FROM emp1 WHERE id NOT IN( SELECT MIN(id) minid FROM emp1 GROUP BY age ) 低版本 mysql 有可能报错 解决方法是:需要先把查询处理的id结果,as 一张表,再做...提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
DISTINCT
语法:
关键词 distinct用于返回唯一不同的值。
- distinct必须放在开头
表结构
案例
SELECT DISTINCT age FROM emp1
SELECT DISTINCT age ,NAME FROM emp1
实际上是根据age 和 NAME 两个字段来去重的
SELECT DISTINCT * FROM emp1
COUNT统计
- 统计字段列重复的个数
SELECT COUNT(DISTINCT age) FROM emp1
SELECT COUNT(DISTINCT NAME) FROM emp1
SELECT age,COUNT(DISTINCT NAME) FROM emp1 GROUP BY age;
group by 去重
用法:
表结构
案例:
SELECT age, COUNT(age) FROM emp1 GROUP BY age;
根据age去重 ,如果age重复,记录选id最小的
- 法1
SELECT * FROM emp1 WHERE id IN ( SELECT MIN(id) FROM emp1 GROUP BY age )
- 法2
SELECT t1.id ,t1.name ,t1.age FROM ( SELECT id,NAME,age FROM emp1 ) t1 INNER JOIN ( SELECT MIN(id) AS id FROM emp1 GROUP BY age )t2 ON t1.id=t2.id
查找所有age重复的 记录
SELECT age FROM emp1 GROUP BY age HAVING COUNT(*)>1
- 方法1
SELECT * FROM emp1 WHERE age IN ( SELECT age FROM emp1 GROUP BY age HAVING COUNT(*)>1 )
- 方法2
SELECT * FROM emp1 a INNER JOIN ( SELECT age FROM emp1 GROUP BY age HAVING COUNT(*)>1 )b ON a.age = b.age
查找所有age不重复的 记录
- 方法1
SELECT * FROM emp1 WHERE age NOT IN ( SELECT age FROM emp1 GROUP BY age HAVING COUNT(*)>1 )
- 方法2
SELECT * FROM emp1 a LEFT JOIN ( SELECT age FROM emp1 GROUP BY age HAVING COUNT(*)>1 )b ON a.age = b.age WHERE b.age IS null
删除重复的数据
1. age重复的数据,只保留id最小的,其余删除
DELETE FROM emp1 WHERE id NOT IN( SELECT MIN(id) minid FROM emp1 GROUP BY age )
低版本 mysql 有可能报错
解决方法是:需要先把查询处理的id结果,as 一张表,再做delete操作,调整如下:
DELETE FROM emp1 WHERE id NOT IN ( SELECT a.id FROM ( SELECT MIN(id)AS id FROM emp1 GROUP BY age ) a )
2.只要age重复的数据 都删除,不保留
DELETE FROM emp1 WHERE age IN ( SELECT age AS id FROM emp1 GROUP BY age HAVING COUNT(*)>1 )
-
mysql去重查询
2021-04-20 03:26:40在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct... -
MySQL去重该使用distinct还是group by?
2020-12-14 07:42:50查看MySQL中是否设置了查询缓存。为了不影响测试结果,需要关闭查询缓存。 show variables like '%query_cache%'; 查看是否开启查询缓存决定于query_cache_type和query_cache_size。 方法一:关闭查询缓存需要... -
mysql 去重查询最新的N条数据
2021-02-03 14:36:59见下文 select a.* FROM (SELECT `t_softwarechangeinf_history`.`softwareID` AS `softwareID`, `t_softwarechangeinf_history`.`version` AS `version`, `t_softwarechangeinf_history`.`... -
mysql去重查询方法优化,干货满满!
2021-07-12 08:08:07mysql数据库的分库分表,有什么中间件?,主键策略是什么 大规模的数据量的分库分表,动态数据源怎么做查询(一个业务需要查询多个数据源的信息,怎么做到找到对应的数据源)? epoll函数怎么理解?epoll函数在别的... -
mysql去重查询并将结果放入新表
2021-10-12 09:06:53CREATE TABLE musicinfofinal2 AS SELECT DISTINCT 产品品牌 FROM `单列数据$`; # 将数据去重并放入新表中 ALTER TABLE musicinfofinal2 ADD id INT(11) PRIMARY KEY AUTO_INCREMENT; # 添加自增主键 -
mysql去重的两种方法详解及实例代码
2020-09-09 21:10:48主要介绍了mysql去重的两种方法详解及实例代码的相关资料,这里对去重的两种方法进行了一一实例详解,需要的朋友可以参考下 -
MySQL中使用去重distinct方法的示例详解
2021-01-19 21:44:46含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段 用法注意: 1.distinct【查询字段】,必须放在要查询... -
mysql优化小技巧之去除重复项实现方法分析【百万级数据】
2020-12-15 01:55:19本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了... -
Mysql 去重查询 DISTINCT
2019-03-07 15:37:581.数据库表中数据存储可能会存在重复的数据,当你仅仅只想列出表中某一字段不同的值,可以使用关键词 DISTINCT 用于返回唯一不同的值; sql语句: SELECT DISTINCT category FROM 表名 ;... -
mysql 去重留一
2021-04-21 04:08:24首先先分析一下 我们现在的目的 是 查询到这俩张表的所有数据 然后进行删除重复记录 每条数据只保留一条第一步:查询以下俩张表的重复记录 (关键字段重复>1)ks_examcity 、 ks_examdistrictselect * from ks_... -
记一次mysql去重查询与删除重复记录
2018-08-27 20:27:34查询: select *,id,count(*) as count from artist group by id having count>1; 删除(删除order_id值大的): delete from artist where id in( SELECT * from (select id from artist group by id... -
mysql查询去重
2020-07-07 12:30:461、在面试的时候碰到一个 问题,就是让写一张表中有id和name 两个字段,查询出name重复的所有数据,现在列下: select * from xi a where (a.username) in (select username from xi group by username having count...