精华内容
下载资源
问答
  • mysql分组后取每组第一条
    万次阅读 多人点赞
    2021-05-06 19:56:41

    环境

    MySQL:5.7
    Java:1.8

    SQL语句的写法:

    select * from (select distinct(a.id) tid, a.* from template_detail a
                   where a.template_id in (3, 4)
                  order by a.id desc) tt
    group by tt.template_id;
    

    思路:先进行排序,然后再进行分组,获取每组的第一条。

    通过子查询中的order by a.id desc就可以做到是每组最新一条,还是第一条。
    通过实践,我们知道这种查询方式,与分组子查询相比性能慢了些,慢一点点

    -- 这种查询方式更快一丢丢
    SELECT bb.`detail`, bb.`id`,bb.`template_id` 
    from `template_detail` bb 
    		INNER JOIN 
    		( 
    		    SELECT MAX(`id`) id, `template_id` 
    		    from `template_detail` GROUP BY `template_id` 
    		) as tb on bb.`id` = tb.id
    

    Q: 为什么要写distinct(a.id)呢?
    A:防止合并的构造(derived_merge);

    什么是derived_merge?

    derived_merge指的是一种查询优化技术,作用就是把派生表合并到外部的查询中,提高数据检索的效率。这个特性在MySQL5.7版本中被引入,可以通过如下SQL语句进行查看/开启/关闭等操作。

    上面虽然听起来感觉很牛逼的样子,但是实际情况是,这个新特性,不怎么受欢迎,容易引起错误。

    可以在子查询中使用以下函数来进行关闭这个特性:

    可以通过在子查询中使用任何阻止合并的构造来禁用合并,尽管这些构造对实现的影响并不明确。 防止合并的构造对于派生表和视图引用是相同的:
       1.聚合函数( SUM()MIN()MAX()COUNT()等)
       2.DISTINCT
       3.GROUP BY
       4.HAVING
       5.LIMIT
       6.UNION或UNION ALL
       7.选择列表中的子查询
       8.分配给用户变量
       9.仅引用文字值(在这种情况下,没有基础表)
    

    子查询order by失效的场景

    select * from (select a.* from template_detail a
                   where a.template_id in (3, 4)
                  order by a.id desc) tt
    group by tt.template_id;
    

    假设我们现在把distinct(a.id) tid, 去掉,会发现子查询(或者叫:临时表)中的order by a.id desc失效了。
    为什么会这样呢?

    原理分析:

    我们这里使用了临时表排序,继而对其结果进行分组,结果显示失败,加了distinct(a.id) tid, 后结果正确,原因是因为临时表(派生表derived table)中使用order by且使其生效,必须满足三个条件:

    1. 外部查询禁止分组或者聚合
    2. 外部查询未指定having,HAVING, order by
    3. 外部查询将派生表或者视图作为from句中唯一指定源

    不满足这三个条件,order by会被忽略。

    一旦外部表使用了group by,那么临时表(派生表 derived table)将不会执行filesort操作(即order by 会被忽略),所以我在临时表中加了(distinct(a.id))。
    加了之后就相当于关闭了该特性,所以也就生效了。

    参考地址:

    https://dev.mysql.com/doc/refman/5.7/en/derived-table-optimization.html

    分组查询取每组最新的数据(order by 和group by使用问题)

    mysql分组后获取每个组排序后的第一条数据(整行)

    Mysql取分组后的每组第一条数据

    更多相关内容
  • Mysql取分组后每组第一条数据 gruop by 分组后 进行 order by mysql会按照 先分组后排序的形式进行输出 并不能做到每组中的第一数据取出。 我的思路是 : 先将要查询的数据表转换成已经排序的临时表 在进行 分组...
  • mysql分组排序取每组第一条

    千次阅读 2021-07-29 12:05:56
    表 (5-8秒刷新次) 更新时间、采集点编号和最新读数 说明一下 表里面有很多点位数据 然后固定时间insert次 我需要拿到 最新时间的 所有点位的 数据 create table C010_CURRENT_DATA ( ID varchar(50) not ...

    记录一下今天遇到的一个需求:

    表 (5-8秒刷新一次) 取更新时间、采集点编号和最新读数
    说明一下 表里面有很多点位数据 然后固定时间insert一次
    我需要拿到 最新时间的 所有点位的 数据

    create table C010_CURRENT_DATA
    (
       ID                   varchar(50) not null comment '唯一id',
       UPD_DATE             datetime comment '更新时间',
       CP_CODE              varchar(50) comment '采集点编号',
       CURRENT_VALUE        decimal(8,2) comment '最新读数',
       primary key (ID)
    );
    alter table C010_CURRENT_DATA comment '各个温度传感器当前最新读数(5-8秒刷新一次)';
    

    数据库测试数据
    在这里插入图片描述

    SQL

    SELECT
    		MAX( t.UPD_DATE ) AS UPD_DATE,
    		t.CP_CODE,
    		SUBSTRING_INDEX( GROUP_CONCAT( t.CURRENT_VALUE ORDER BY t.UPD_DATE DESC ), ',', 1 ) AS codeValue
    	FROM
    		( SELECT UPD_DATE, CP_CODE, CURRENT_VALUE FROM c010_current_data ) t
    	GROUP BY
    	t.CP_CODE 
    

    查询后数据
    在这里插入图片描述

    参考文档:https://blog.csdn.net/m0_37797991/article/details/80511855

    展开全文
  • mysql分组后取每组第一条

    千次阅读 2022-04-08 12:21:44
    SELECT * FROM (SELECT bs_file_resource_t.* FROM bs_file_resource_t Join bs_apply_car_t on ...date DESC,res_kind LIMIT 10000) t GROUP BY source_id,res_kind 通过source_id分组后,又分为三组,每组取一条数据
    SELECT * FROM
    (SELECT bs_file_resource_t.*
    FROM
    
    bs_file_resource_t 
    Join bs_apply_car_t
    on bs_file_resource_t.source_id = bs_apply_car_t.car_id
    
    WHERE car_status=1 AND source_type=1 AND res_type = 1
    ORDER BY write_date DESC,res_kind LIMIT 10000) t 
    GROUP BY source_id,res_kind
    

    通过source_id分组后,又分为三组,每组取一条数据
    在这里插入图片描述

    展开全文
  • –按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: nameval memo a 2 a2(a的第二个值) a 1 a1–a的第一个值 a 3 a3:a的第三个值 b 1 b1–b的第一个值 b 3 b3:b的第三个值 b 2 b2b2b2b2 b 4 b4b4 b ...
  • MySQL8.0 Java8建表语句: 数据准备: 随机生成姓名,依次插入模拟数据 自动生成项目地址 巧妙利用mysql的max、min函数,网上流传最多的是下面写法: 这样写有个弊端,limit限制了数据量,对以后的业务扩展都会有...

    MySQL分组排序



    前言

    业务场景:student_score是学生的分数表,其中包含id、学生、科目、创建时间、分数字段,现在我们需要进行平均分、最大分数、最小分数等不同纬度的统计。

    运行环境:
    MySQL8.0
    Java8


    一、前期准备

    建表语句:

    CREATE TABLE `student_score` (
      `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
      `student` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '学生姓名',
      `project` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '科目',
      `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      `score` int DEFAULT NULL COMMENT '分数',
      PRIMARY KEY (`id`) USING BTREE,
      UNIQUE KEY `student` (`student`,`project`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
    

    数据准备:
    随机生成姓名,依次插入模拟数据
    自动生成项目地址


    二、统计

    1.平均分

    select group_concat(distinct student), avg(score) from student_score group by student
    

    在这里插入图片描述

    2.计算个人最低分

    select group_concat(distinct student), min(score) from student_score group by student
    

    该处使用的url网络请求的数据。

    3.计算个人最高分

    select group_concat(distinct student), max(score) from student_score group by student
    

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/d7d64621e0a84e64b9af0688bc0135aa.png


    总结

    巧妙利用mysql的max、min函数,网上流传最多的是下面写法:

    select * from (select * from student_score order by score desc limit 1000) a group by a.student
    

    这样写有个弊端,limit限制了数据量,对以后的业务扩展都会有影响

    max和min也有弊端:
    在这里插入图片描述
    如图project字段并不是正确的科目,需要根据业务来量身打造sql

    展开全文
  • 记录一下最近的一个需求,查不同产品排名第一的图片作为主图其实一开始想用的是mybatis的级联查询,结果说需要一次性全部查出来那就没事了,改sql亲测实用。
  • mysql分组后获取第一条数据

    千次阅读 2022-01-04 16:08:44
    现在,需要根据path排序,聚合查询级主题的名称和数。 直接上结果: 两种写法: : select tt.name as subjectName,path,count(*) as countNum from (select distinct t.table_id_, t.SUBJECT_ID_, s.name_ as...
  • 查询个项目下的按房间号排序的第一个房间 room表通过project_id字段与project表关联 MySQL8.0 # ROW_NUMBER() 函数mysql8才支持 select * from ( select ROW_NUMBER()over(partition by p.id order by r....
  • 如图,如果我们按 number 分组后再按 is_bak 从大到小排序获取最大的第一条数据,那么最后结果就是 id 为 1,4,6 这 3 。 select t.* from ( select distinct(id) as tt,t1.* from a_t as t1 order by is_bak ...
  • 个学生分数表(student),数据表结构如下: id(当前表ID) student_id(学生ID) ... 我想根据学生分组,得到分组中分数最高的那一条数据。 先来几种错误的写法: 错误: SELECT m..
  • mysql分组排序取第一条数据

    千次阅读 2022-02-22 19:45:31
    mysql 根据一个字段分组,各种排序,然后,取第一条数据 1. 分组字段加排序字段先排序 2. 再按分组字段分组取第一条即可 with t_picture as( SELECT npi_product_id,is_default_one,update_time, uri FROM ...
  • 一、需要实现分组排序并且取组内状态优先级最高的数据有一张这样的数据表, 需求是根据error_type分组然后status最小的第一条数据第一种写法:select t.* from (select e.* from error_record e where e.status >...
  • 首先,将按条件查询并排序的...mysql> select accepttime,user,job from tuser_job where user =8 order by accepttime desc;+---------------------+------+-----+| accepttime | user | job |+---------------...
  • mysql分组之后取每组前几数据

    千次阅读 2022-03-02 16:40:14
    // 个班级第一名的数据 【LIMIT 10000 的 10000 需要设置一个远远大于该表总数的数字】 select * from (SELECT * from score WHERE score > 60 ORDER BY score desc LIMIT 10000) as c GROUP BY class; // 个...
  • MySQL分组取组第一条数据
  • 1.创建表create table tb(name varchar(10),val int,memo varchar(20));2.插入数据insert into tb values('a...insert into tb values('a', 1, 'a1--a的第一个值');insert into tb values('a', 3, 'a3:a的第三个值')...
  • --按某一字段分组取最大(小)值所在行的数据/*数据如下:name val memoa 2 a2(a的第二个值)a 1 a1--a的第一个值a 3 a3:a的第三个值b 1 b1--b的第一个值b 3 b3:b的第三个值b 2 b2b2b2b2b 4 b4b4b 5 b5b5b5b5b5*/--创建...
  • MySql分组后如何随机获取每组一条数据发布时间:2020-10-26 15:10:32来源:亿速云阅读:62作者:LeahMySql分组如何随机获取每组一条数据?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多...
  • mysql分组排序取第一条记录

    千次阅读 2021-04-25 02:17:41
    先说结论:在Mysql中,通过GroupBy分组后,会主键ID最小的一条数据作为分组后的数据。如果存在需求,根据其他字段排序后取对应字段最大或者最小值的话,通过SQL语句是可以实现的,核心在于排序需要加Limit xx。...
  • mysql中有一张表用户表user 其中李四是重复数据 id name 1 张三 2 李四 3 李四 4 王五 如何去重实现查询效果为 id name 1 张三 2 李四 4 王五 id为主键,去重之后保留id最小的一条数据 或者可以实现效果为 id name 1 ...
  • MAX(max.line) lineMax FROM ( SELECT DISTINCT (a.id) tt, a.* FROM student a ORDER BY a.line DESC ) max GROUP BY student_id DISTINCT(主键)让数据集先进行排序再分组取排序第一条 ...
  • 1. 需求:分组查询,分组第一条记录 1.1 方案1 使用 ANY_VALUE函数,返回该分组中的第一个 tips: Mysql5.7及之后的版本, 因为默认sql_mode=“ONLY_FULL_GROUP_BY”不能直接返回group by 中不包含的字段 ...
  • 环境 MySQL:5.7 Java:1.8 SQL语句的写法: select * from (select distinct(a.id) tid, a.* from template_detail a ...思路:先进行排序,然后再进行分组,获取每组第一条。 Q: 为什么要写distinct...
  • oracle分组后取每组第一条数据

    千次阅读 2021-05-04 01:00:08
    oracle 分组后取每组第一条数据‘数据格式 分组取第一的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, test ...MSSQL 分组后取每组第一条(group by order by)查询中经常...
  • 没人刚发起感召,前三笔钱的入账时间和金额,这把大哥整懵逼了,group by在某些方面是好使,但这次不能为我所用了,获取第一笔进账是简单,可以用group by 直接获取就好,但是后面的呐,我百度反思,最终实现,上代码,今天...
  • 解析: 2 > : 表示获取每一类的数据的数 du.name = origin .name : 表示分组依据,按照name分组 du.age > origin.age : 排序方式,也就是获取前多少数据或者倒数多少数据。> 表述获取前多少数据,表示获取...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,089
精华内容 23,635
热门标签
关键字:

mysql分组后取每组第一条

mysql 订阅