Mysql分组排序取每组第一条(二种实现方式)
文章目录
- 前言
- 前期准备
- 第一种
- 原因分析:
- 解决:
- 第二种
- GROUP_CONCAT函数解释:
前言
记录一下最近的一个需求,查不同产品排名第一的图片作为主图
其实一开始想用的是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
问题重点:
- 相信个别同学复制过去执行就报了
this is incompatible with sql_mode=only_full_group_by
错误 - 之所有不推荐在实战中这样写,是因为其中子查询
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分组排序取每组第一条(二种实现方式)相关推荐
- mysql分组排序取每组第一条
记录一下今天遇到的一个需求: 表 (5-8秒刷新一次) 取更新时间.采集点编号和最新读数 说明一下 表里面有很多点位数据 然后固定时间insert一次 我需要拿到 最新时间的 所有点位的 数据 cre ...
- oracle 取分组第一行,oracle分组后取每组第一条数据
oracle 分组后取每组第一条数据 '数据格式 分组取第一条的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER ...
- PG数据库:分组后取每组第一条数据
PG数据库查询遇到一个需求,数据库表data,先对其中设备标识字段a分组group by,然后查一段时间内的每一个设备数据字段b的极大值和极大值发生的数据时间time,想起之前Oracle有类似写法, ...
- oracle 分组后取每组第一条数据
数据格式 分组取第一条的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, test1 ...
- Oracle分组后取每组第一条
数据格式: 分组取第一条的效果: SQL: SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY X ORDER BY Y DESC) RN, T ...
- mysql分组排序取第一条记录
方式1:内层使用DISTINCT SELECTtype,senderName,subTitle FROM(SELECT DISTINCTTYPE AS type,SENDER_USERNAME AS ...
- mysql 分组排序取前n_mysql分组排序取前N条记录的最简洁的单条sql ! | 学步园
-- mysql分组排序取前N条记录的最简洁的单条sql. use test; drop table if exists test; create table test ( id int primar ...
- 【编程技巧】Stream流之list转map、分组取每组第一条
编程技巧-Stream流之list转map.分组取每组第一条 目录 编程技巧-Stream流之list转map.分组取每组第一条 前言 一.list转map 二.分组取每组第一条数据 总结 前言 JD ...
- mysql 组内排名_【原】MySQL分组排序(包含组内排名、求中位数)
需求:mysql分组排序,1.取最大(小)前N位,2.取中位数 本例以shop_id和cat_id字段共同分组,并对最细粒度的分组cat_id降序排列 原始表: 2.mysql分组排序(含组内排名) ...
最新文章
- u盘可以安装java吗_java下载安装 (三)Java 开发环境配置
- 在ASP.net 中对GridView中数据的删除、编辑等操作:
- 为什么你总是申请不到大额贷款?
- Android 进程间通信
- 如鹏网学习笔记(十二)HTML5
- Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询
- C++17 fold expression
- ASA8.4端口映射篇
- bcp sqlcmd bulkinsert在unicode问题,Unexpected EOF encountered in BCP data-file
- MacOS Mojave 更换开机登录界面壁纸
- 反向题在测试问卷信效度_防御方式问卷 (DSQ)信度和效度研究
- 第三方定量定性质谱检测技术实验
- 5G与人工智能有什么关系?
- linux系统下使用润乾报表设计器
- Browserslist: caniuse-lite is outdated. Please run next command npm update caniuse-lite browserslis
- win10笔记本或电脑WLAN密码忘记了不怕,【win10】查看以前连接过的wifi密码
- The Auto-extending innodb_system data file './ibdata1' is of a different size 6400 pages (rounded do
- dota2自建房间服务器,创建房间与房间设置 - DOTA2 - 刀塔官方网站 - 勇士令状全新上线 天陨旦活动模式推出...
- jetson nano yolov5部署及USB摄像头实时检测 初次尝试
- 做好工作交接对自己多重要,说到心坎了