公司有个需求,要求将最近使用的N条记录排序到最前面,同时不同的模块展示的最近记录是不同的,因此考虑在数据表后面增加一个json字段用于存储最近使用的模块和时间信息。
通过该方式可以做到将最近的使用记录排序到最前面,但是后面又增加了限制,要求只返回最近的5条数据,因此处理排序,还需要控制排序的数量。经过考虑使用row_number来赋予行号,同时通过行号来控制记录数量。
在本地使⽤row_number()没有问题,但是去服务器上⾯查询数据得时候发现查询不了,因为服务器版本的mysql是5.6的,暂不⽀持。
使用派生表来实现row_number()的功能:
- 首先,定义变量 @row_number ,并初始化为0;
- 然后,在查询时我们为 @row_number 变量加1。
在这种方法中,派生表必须要有别名,否则执行时会出错。
最终SQL:
select *, if(a.row <= 5 and a.`u` is not null, 1, 0) as ren
from (SELECT *,
(@row_number := @row_number + 1) as row,
json_extract(`usage`, '$."242201cbfc6f9d4f162cc4672cf7819a"') as `u`
FROM t_log_event_attribute,
(SELECT @row_number := 0) AS t
ORDER BY `u` desc) a
ORDER BY ren desc , create_time desc limit 0,10;
效果: