mysql 单表实现组内排序

本文介绍在MySQL中如何正确使用ORDER BY与GROUP BY。由于直接结合使用这两个子句可能会导致显示不准确的数据,文章提供了一种解决方案:通过先进行内部查询排序再对外部查询结果进行分组,确保数据的准确性。

在mysql中 order by 和group by 不能同时使用,mysql默认会选取分组中的第一条数据显示出来,解决的方法是,先做一次查询在里面进行排序,然后再进行分组

	SELECT
			*
		FROM
			(
				SELECT
					o.id,
					o.mark
				FROM
					order o
				WHERE
					o.name=#{name}
				AND o.TYPE = 8
				ORDER BY
					o.ADDTIME DESC
			) AS t
		GROUP BY
			t.id


MySQL 中,如果需要实现先按某一字段分组(`GROUP BY`),然后在每内部进行排序内排序),可以通过多种方式实现。由于 `GROUP BY` 操作会将多条记录合并为一条结果,因此直接对内数据进行排序并保留所有记录需要借助子查询或窗口函数(MySQL 8.0 及以上支持)。 以下是几种常见的实现方法: ### 使用子查询和自连接 这种方法适用于所有版本的 MySQL。其基本思路是通过自连接来计算每个内的排序顺序。 ```sql SELECT a.字段, a.排序字段, COUNT(b.排序字段) + 1 AS rank FROM 名 a LEFT JOIN 名 b ON a.字段 = b.字段 AND a.排序字段 < b.排序字段 GROUP BY a.字段, a.排序字段 ORDER BY a.字段, rank; ``` 该查询通过比较同一内的排序字段值,计算出每个记录在其内的排名。 ### 使用变量模拟窗口函数(适用于 MySQL 5.x) 在没有窗口函数支持的版本中,可以使用用户变量来模拟 `ROW_NUMBER()` 功能。 ```sql SELECT 字段, 排序字段, rank FROM ( SELECT 字段, 排序字段, @rank := IF(@current_group = 字段, @rank + 1, 1) AS rank, @current_group := 字段 FROM 名 ORDER BY 字段, 排序字段 DESC ) ranked WHERE rank <= N; -- 可选:限制每返回前N条记录 ``` 此方法通过变量 `@rank` 和 `@current_group` 来跟踪当前和生成内排名[^2]。 ### 使用窗口函数(适用于 MySQL 8.0+) 从 MySQL 8.0 开始,引入了窗口函数,可以直接使用 `ROW_NUMBER()`、`RANK()` 或 `DENSE_RANK()` 函数来实现内排序。 ```sql SELECT 字段, 排序字段, ROW_NUMBER() OVER (PARTITION BY 字段 ORDER BY 排序字段 DESC) AS rank FROM 名; ``` 窗口函数 `ROW_NUMBER()` 会在每个由 `PARTITION BY` 定义的内生成一个唯一的行号,按照指定的排序规则排列[^2]。 ### 使用 `GROUP_CONCAT` 和 `SUBSTRING_INDEX` 获取内最大/最小记录 如果你只需要获取每排序后的第一条记录(如最新或最早的一条),可以结合 `GROUP_CONCAT` 和 `SUBSTRING_INDEX` 函数实现。 ```sql SELECT 设备编码, SUBSTRING_INDEX(GROUP_CONCAT(创建时间 ORDER BY 创建时间 DESC), ',', 1) AS last_time FROM t_xxx GROUP BY 设备编码; ``` 该方法利用 `GROUP_CONCAT` 将内所有记录按指定顺序拼接成字符串,再通过 `SUBSTRING_INDEX` 提取第一个元素,从而获得内排序后的位置[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值