mysql 按照分组筛选出时间倒序前三条记录
1. 问题描述
在 MySQL 低版本 (5.7 以下) 中,如何按照分组筛选出时间倒序前三条记录?
2. 解决方法
1 | SELECT t.* |
(1) 在子查询中,使用变量 @rn
和 @prev_group
来记录当前行的记录编号和前一行的分组。
(2)@rn := IF(@prev_group = group_column, @rn + 1, 1) AS rn
这一行代码的作用是:如果当前行的分组与上一行相同,则记录编号 rn
递增 1, 否则从 1 开始计数。
(3)@prev_group := group_column
这一行代码是更新上一行的分组。
(4) 在外层查询中,使用 WHERE rn <= 3
来筛选出每个分组中时间倒序的前 3 条记录。
(5) 最后按分组 group_column
和时间 time_column
倒序排列输出结果。
你可以将 your_table
替换成你自己的表名,group_column
替换成你表中的分组列名,time_column
替换成你表中的时间列名。
这种方法在 MySQL 5.7 以下版本中都可以使用,不需要使用 ROW_NUMBER()
函数,性能也较好。
在 MySQL8.0 及以上可以使用如下方法:
1 | SELECT t.* |
(1)首先使用子查询,在每个分组 group_column
内根据时间列 time_column
使用 ROW_NUMBER()
函数给每条记录编号,按时间顺序倒序排列。
(2)然后在外层查询中,使用 WHERE rn <= 3
筛选出每个分组中时间倒序的前 3 条记录。
(3)最后按分组 group_column
和时间 time_column
倒序排列输出结果。
这样就可以实现按分组筛选出时间倒序前 3 条记录的功能。你可以将 your_table
替换成你自己的表名,group_column
替换成你表中的分组列名,time_column
替换成你表中的时间列名。