1、业务场景:
查询各省份下最新的一条数据
期望结果:
2、实现方式
2.1. 方式一
order by 之后 再分组,
SELECT
op_time,
op_name,
op_value
FROM
( SELECT `op_time`, `op_name`, `op_value` FROM test_info WHERE 1 = 1 ORDER BY `op_time` DESC LIMIT 10 ) AS a
GROUP BY
op_name
ORDER BY
op_time ASC;
- 注意:
1、由于mysql版本问题,需要加 limit ,否则子查询排序不生效。
2、limit 圈定范围,可以先查一遍数据记录。
2.2. 方式二
group by 子查询里使用窗口函数
SELECT
op_time,
op_name,
op_value
FROM
( SELECT `op_time`, `op_name`, `op_value`, ROW_NUMBER() over ( ORDER BY op_time DESC ) AS r FROM test_info WHERE 1 = 1 ) AS a
GROUP BY
op_name
ORDER BY
op_time ASC;
- 注意:
1、MySql版本5.8及以上
2、查看MySql版本:
SELECT @@version;
3、探讨
3.1. 直接group by
SELECT
id,
op_time,
op_name,
op_value
FROM
test_info
GROUP BY
op_name
ORDER BY
op_time ASC;
结果:
原因:
group by :根据指定的规则将数据划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。group by 再对数据处理的时候有默认的排序,无法按照业务需求指定排序。
3.2. 不加 limit
SELECT
id,
op_time,
op_name,
op_value
FROM
( SELECT `id`,`op_time`, `op_name`, `op_value` FROM test_info WHERE 1 = 1 ORDER BY `op_time` DESC LIMIT 10 ) AS a
GROUP BY
op_name
ORDER BY
op_time ASC;
结果:与直接group by 一致。
原因:
版本问题,group by 的子查询里的order by 排序不生效。