精华内容
下载资源
问答
  • Mysql去重查询(根据指定字段去重)
    万次阅读 多人点赞
    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去重的方法整理的相关资料,需要的朋友可以参考下
  • 前几天在做一个需求的时候,需要清理mysql中重复的记录,当时的想法是通过代码遍历写出来,然后觉得太复杂,心里想着应该可以通过一个sql语句来解决问题的。查了资料,请教了大佬之后得出了一个很便利的sql语句,...
  • MySQL去重查询只保留一条最新的记录

    千次阅读 多人点赞 2022-02-20 04:36:34
    MySQL去重查询只保留一条最新的记录

    需求: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

    文末:若有错误请批评指正.

    展开全文
  • •问题提出 源表t_source结构如下: item_id int, created_time datetime, modified_time datetime, item_name varchar(20), other varchar(20) 要求: 1.源表中有100万条数据,其中...8G物理内存(MySQL配置4G)
  • age重复的数据,只保留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中是否设置了查询缓存。为了不影响测试结果,需要关闭查询缓存。 show variables like '%query_cache%'; 查看是否开启查询缓存决定于query_cache_type和query_cache_size。 方法一:关闭查询缓存需要...
  • 见下文 select a.* FROM (SELECT `t_softwarechangeinf_history`.`softwareID` AS `softwareID`, `t_softwarechangeinf_history`.`version` AS `version`, `t_softwarechangeinf_history`.`...
  • mysql数据库的分库分表,有什么中间件?,主键策略是什么 大规模的数据量的分库分表,动态数据源怎么做查询(一个业务需要查询多个数据源的信息,怎么做到找到对应的数据源)? epoll函数怎么理解?epoll函数在别的...
  • CREATE TABLE musicinfofinal2 AS SELECT DISTINCT 产品品牌 FROM `单列数据$`; # 将数据去重并放入新表中 ALTER TABLE musicinfofinal2 ADD id INT(11) PRIMARY KEY AUTO_INCREMENT; # 添加自增主键
  • 主要介绍了mysql去重的两种方法详解及实例代码的相关资料,这里对去重的两种方法进行了一一实例详解,需要的朋友可以参考下
  • 含义:distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段 用法注意: 1.distinct【查询字段】,必须放在要查询...
  • 本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下: 说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了...
  • Mysql 去重查询 DISTINCT

    2019-03-07 15:37:58
    1.数据库表中数据存储可能会存在重复的数据,当你仅仅只想列出表中某一字段不同的值,可以使用关键词 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&gt;1; 删除(删除order_id值大的): delete from artist where id in( SELECT * from (select id from artist group by id...
  • mysql查询去重

    千次阅读 2020-07-07 12:30:46
    1、在面试的时候碰到一个 问题,就是让写一张表中有id和name 两个字段,查询出name重复的所有数据,现在列下: select * from xi a where (a.username) in (select username from xi group by username having count...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,817
精华内容 21,926
关键字:

mysql去重查询

mysql 订阅
友情链接: fifo_test.zip