文章目录

  • 前言
  • 前期准备
  • 第一种
    • 原因分析:
    • 解决:
  • 第二种
    • 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

问题重点:

  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分组排序取每组第一条(二种实现方式)相关推荐

  1. mysql分组排序取每组第一条

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

  2. oracle 取分组第一行,oracle分组后取每组第一条数据

    oracle 分组后取每组第一条数据 '数据格式 分组取第一条的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER ...

  3. PG数据库:分组后取每组第一条数据

    PG数据库查询遇到一个需求,数据库表data,先对其中设备标识字段a分组group by,然后查一段时间内的每一个设备数据字段b的极大值和极大值发生的数据时间time,想起之前Oracle有类似写法, ...

  4. oracle 分组后取每组第一条数据

    数据格式 分组取第一条的效果 sql SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY x ORDER BY y DESC) rn, test1 ...

  5. Oracle分组后取每组第一条

    数据格式: 分组取第一条的效果: SQL: SELECT * FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY X ORDER BY Y DESC) RN, T ...

  6. mysql分组排序取第一条记录

    方式1:内层使用DISTINCT SELECTtype,senderName,subTitle FROM(SELECT DISTINCTTYPE AS type,SENDER_USERNAME AS ...

  7. mysql 分组排序取前n_mysql分组排序取前N条记录的最简洁的单条sql ! | 学步园

    -- mysql分组排序取前N条记录的最简洁的单条sql. use test; drop table if exists test; create table test ( id int primar ...

  8. 【编程技巧】Stream流之list转map、分组取每组第一条

    编程技巧-Stream流之list转map.分组取每组第一条 目录 编程技巧-Stream流之list转map.分组取每组第一条 前言 一.list转map 二.分组取每组第一条数据 总结 前言 JD ...

  9. mysql 组内排名_【原】MySQL分组排序(包含组内排名、求中位数)

    需求:mysql分组排序,1.取最大(小)前N位,2.取中位数 本例以shop_id和cat_id字段共同分组,并对最细粒度的分组cat_id降序排列 原始表: 2.mysql分组排序(含组内排名) ...

最新文章

  1. u盘可以安装java吗_java下载安装 (三)Java 开发环境配置
  2. 在ASP.net 中对GridView中数据的删除、编辑等操作:
  3. 为什么你总是申请不到大额贷款?
  4. Android 进程间通信
  5. 如鹏网学习笔记(十二)HTML5
  6. Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询
  7. C++17 fold expression
  8. ASA8.4端口映射篇
  9. bcp sqlcmd bulkinsert在unicode问题,Unexpected EOF encountered in BCP data-file
  10. MacOS Mojave 更换开机登录界面壁纸
  11. 反向题在测试问卷信效度_防御方式问卷 (DSQ)信度和效度研究
  12. 第三方定量定性质谱检测技术实验
  13. 5G与人工智能有什么关系?
  14. linux系统下使用润乾报表设计器
  15. Browserslist: caniuse-lite is outdated. Please run next command npm update caniuse-lite browserslis
  16. win10笔记本或电脑WLAN密码忘记了不怕,【win10】查看以前连接过的wifi密码
  17. The Auto-extending innodb_system data file './ibdata1' is of a different size 6400 pages (rounded do
  18. dota2自建房间服务器,创建房间与房间设置 - DOTA2 - 刀塔官方网站 - 勇士令状全新上线 天陨旦活动模式推出...
  19. jetson nano yolov5部署及USB摄像头实时检测 初次尝试
  20. 做好工作交接对自己多重要,说到心坎了

热门文章

  1. 手机可以玩python吗_在手机上玩python编程-Pydroid3
  2. 互联网快讯:五菱与B站跨界合作;猿辅导积极转型素质教育
  3. 高频线子电路 (不含绪论部分)
  4. html5水印消除,HTML5网页水印SDK的实现方法
  5. CorelDRAW不同选择工具的作用及用法汇总
  6. html关闭页面弹出再见信息提示框,js弹出框、对话框、提示框、弹窗总结
  7. 40 岁的中年失业人怎么活下去?,android开发环境搭建
  8. 是时候开发你自己的vscode扩展插件了
  9. 专业游戏手机洞察:黑鲨市占率排名第一,年轻男性用户为主力军
  10. ubuntu安装和卸载python3.8