Mysql 分组后组内排序按字段取最大或最小的数据

本文介绍了使用SQL进行分组查询的两种实用技巧:一是按类别分组并选取每组最新的文章;二是按类别分组并找出每组内阅读量最少的文章。通过具体SQL语句示例,展示了如何灵活运用max()和min()函数结合group by子句实现这些需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的个人博客:逐步前行STEP

示例:
1、将文章按类型的分组,并获取类型分组中最新的一篇文章

select author,max(`updated_at`) as updated_at from articles 
	group by category_id
	order by updated_at desc

2、将文章按类型的分组,并获取类型分组中阅读量最小的一篇文章

select author,min(`read_cnt`) as read_cnt from articles 
	group by category_id
	order by read_cnt
### MySQL 分组后按某列排序最大值 在MySQL中,可以通过多种方式实现分组后按照特定列排序得每最大值。以下是几种常见且有效的方法: #### 方法一:使用子查询与窗口函数 这种方法适用于较新的MySQL版本(8.0及以上),其中引入了窗口函数的支持。 ```sql WITH RankedData AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY column_for_grouping ORDER BY target_column DESC) as rn FROM table_name ) SELECT * FROM RankedData WHERE rn = 1; ``` 此方法通过创建一个带有排名的临时表`RankedData`,它基于指定用于分组的列(`column_for_grouping`)以及要排序的目标列(`target_column`)进行分区和排序[^2]。最终只选排名第一的数据作为各内的最大值记录。 #### 方法二:嵌套查询结合聚合函数 对于不支持窗口函数的老版MySQL,可以采用如下策略: ```sql SELECT t.* FROM table_name t JOIN ( SELECT column_for_grouping, MAX(target_column) max_value FROM table_name GROUP BY column_for_grouping ) subq ON t.column_for_grouping = subq.column_for_grouping AND t.target_column = subq.max_value; ``` 这里首先在一个内部查询中计算出各个分组下的最大目标列值,再将其结果集与原始表格做连接操作,从而筛选得到完整的行信息[^3]。 #### 方法三:利用字符串拼接技巧 当只需要获得单个字段最大值而非整行数据时,还可以考虑应用字符串处理函数来简化逻辑: ```sql SELECT column_for_grouping, SUBSTRING_INDEX(GROUP_CONCAT(target_column ORDER BY target_column DESC SEPARATOR ','), ',', 1) AS max_value FROM table_name GROUP BY column_for_grouping; ``` 这段代码借助于`GROUP_CONCAT()`函数将同属一的所有目标列值串联起来,并依据降序排列;之后调用`SUBSTRING_INDEX()`截第一个逗号前的内容即为该最大的那个数值[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲敲代码、落灯花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值