精华内容
下载资源
问答
  • mysql 分组排序取每组第一条
    2022-09-05 15:37:33

    前言

    记录一下最近的一个需求,查不同产品排名第一的图片作为主图

    其实一开始想用的是mybatis的级联查询,结果说需要一次性全部查出来

    那就没事了,改sql咯:

    亲测实用

    前期准备

    MySQL:8.0
    Java:1.8

    建表语句:

    CREATE TABLE `product_image` (
      `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '主键id',
      `product_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '产品id',
      `sort_id` int NOT NULL COMMENT '图片序号',
      `img_url` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '图片路径',
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='产品图片表';
    

    第一种

    这一种也是网上推荐最多的,但个人觉得局限性太大,不介意用在实战上

    sql:

    select * from (select * from product_image order by sort_id  limit 10000) a group by a.product_id
    

    问题重点:

    1. 相信个别同学复制过去执行就报了this is incompatible with sql_mode=only_full_group_by错误
    2. 之所有不推荐在实战中这样写,是因为其中子查询limit 10000已经固定写死了

    原因分析:

    一、这个错误发生在mysql 5.7.5 版本及以上版本会出现的问题:
    mysql 5.7.5版本以上默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了"SQL92标准"。
    很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。

    二、在sql执行时,出现该原因,简单来说就是:
    由于开启了ONLY_FULL_GROUP_BY的设置,如果select 的字段不在 group by 中,
    并且select 的字段未使用聚合函数(SUM,AVG,MAX,MIN等)的话,那么这条sql查询是被mysql认为非法的,会报错误…

    所以mysql在5.7.5版本及以上版本就会报这个错误

    解决:

    select ANY_VALUE(id),
      product_id,
     ANY_VALUE(sort_id) from (select * from product_image order by sort_id  limit 100000) a group by a.product_id
    

    只需要把需要查询的字段用ANY_VALUE(字段)函数包住就能正常运行

    有没有同学想过为什么需要limit:

    在这里插入图片描述

    看着极其多余,而且写死数量所以导致实战不实用

    那是因为

    从mysql5.7开始,子查询的排序已经变为无效了。所以要加个limit,这样子查询就不光是排序,所以此时排序会生效,但有条数限制10000

    第二种

    是使用GROUP_CONCAT函数解决的

    sql:

    select group_concat(distinct product_id ORDER BY sort_id), min(id) ,min(img_url)from product_image group by product_id
    

    GROUP_CONCAT函数解释:

    GROUP_CONCAT函数用于将GROUP BY产生的同一个分组中的值连接起来,返回一个字符串结果

    GROUP_CONCAT函数首先根据GROUP BY指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔,由函数参数(字段名)决定要返回的列

    语法结构:

    GROUP_CONCAT([DISTINCT] 要连接的字段 [ORDER BY 排序字段 ASC/DESC] [SEPARATOR '分隔符'])
    

    说明:

    (1) 使用DISTINCT可以排除重复值

    (2) 如果需要对结果中的值进行排序,可以使用ORDER BY子句

    (3) SEPARATOR '分隔符’是一个字符串值,默认为逗号

    (1) 使用DISTINCT可以排除重复值

    (2) 如果需要对结果中的值进行排序,可以使用ORDER BY子句

    (3) SEPARATOR '分隔符’是一个字符串值,默认为逗号

    其实我还是更倾向于级联查,不用再重新组装数据,代码也更简洁

    更多相关内容
  • 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

    展开全文
  • 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

    展开全文
  • MySQL分组取组第一条数据

    前言

    MySQL分组取组内第一条数据


    代码实现–这种❌

    SELECT
    	* 
    FROM
    	cl_Issue_accessory 
    
    GROUP BY
    	type_id 
    ORDER BY
    	end_time DESC
    

    在这里插入图片描述

    select * from cl_Issue_accessory where type_id =2 ORDER BY end_time DESC
    

    检查一下时间排序:
    在这里插入图片描述
    真正的分组,取数据

    select t.* from (
        select * from cl_Issue_accessory cia order by cia.end_time desc  limit 1000
    ) t group by t.type_id
    	
    

    在这里插入图片描述

    展开全文
  • 一、需要实现分组排序并且取组内状态优先级最高的数据有一张这样的数据表, 需求是根据error_type分组然后status最小的第一条数据第一种写法:select t.* from (select e.* from error_record e where e.status >...
  • mysql中有一张表用户表user 其中李四是重复数据 id name 1 张三 2 李四 3 李四 4 王五 如何去重实现查询效果为 id name 1 张三 2 李四 4 王五 id为主键,去重之后保留id最小的一条数据 或者可以实现效果为 id name 1 ...
  • 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 ...
  • 环境 MySQL:5.7 Java:1.8 SQL语句的写法: select * from (select distinct(a.id) tid, a.* from template_detail a ...思路:先进行排序,然后再进行分组,获取每组第一条。 Q: 为什么要写distinct...
  • mysql分组排序取第一条记录

    千次阅读 2021-04-25 02:17:41
    先说结论:在Mysql中,通过GroupBy分组后,会主键ID最小的一条数据作为分组后的数据。如果存在需求,根据其他字段排序对应字段最大或者最小值的话,通过SQL语句是可以实现的,核心在于排序后需要加Limit xx。...
  • 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 ...思路:先进行排序,然后再进行分组,获取每组第一条。 Q: 为什么要写distinct(a.i
  • 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分组后,又分为三组,每组取一条数据
  • mysql知识点实现排序分组
  • 我先对表进行排序:select * FROM group_efficiencys ORDER BY tw_group_id ASC ,updated_at DESC如上图,我想取每组第一条数据然后我写了如下sql:SELECT a.tw_group_id,a.normal_val,a.excess_val,a.saturated_val ...
  • 乍一看没什么问题,但是看执行计划,会发现最外面一层的select没有走索引,而是全表扫描,这样随着数据量的增大,必将成为一个慢sql。...需要先根据创建时间倒排,再根据业务id分组,取每分组第一条数据。......
  • sql 排序 ROW_NUMBER() OVER 函数这是我之前写的sql排序函数,现在的需求是mysql 分组排序并且取第一条数据。 mysql用子查询实现类似于row_number()函数的功能 场景: versionId=0时,是默认版本,即该记录...
  • 个学生分数表(student),数据表结构如下: id(当前表ID) student_id(学生ID) ... 我想根据学生分组,得到分组中分数最高的那一条数据。 先来几种错误的写法: 错误: SELECT m..
  • 查询个项目下的按房间号排序第一个房间 room表通过project_id字段与project表关联 MySQL8.0 # ROW_NUMBER() 函数mysql8才支持 select * from ( select ROW_NUMBER()over(partition by p.id order by r....
  • 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...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,135
精华内容 17,654
热门标签
关键字:

mysql 分组排序取每组第一条

mysql 订阅