Laravel Eloquent:按日期各取25条数据并实现分页查询
我懂你要做的事儿了——先从tasks_complete表的每个日期里捞最多25条记录,再把这些汇总好的结果做常规分页。之前用子查询和左连接没搞定很正常,这个需求得先按日期分组取TopN,再处理分页,我给你写个基础的SQL示例,应该能直接用:
实现思路与示例代码
核心思路是先按日期分组筛选出每个日期的前25条数据,再对这些筛选后的结果集进行分页。这里用窗口函数ROW_NUMBER()来实现分组编号是最直接的方式,大部分主流数据库(MySQL 8+/PostgreSQL/SQL Server等)都支持。
基础示例代码(以MySQL 8+为例)
-- 第一步:先给每个日期下的记录编号,取前25条 WITH date_top25 AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY DATE(task_complete_date) ORDER BY task_complete_date) AS row_num FROM tasks_complete ) -- 第二步:对筛选后的结果做分页 SELECT * FROM date_top25 WHERE row_num <= 25 ORDER BY DATE(task_complete_date), row_num LIMIT {page_size} OFFSET ({page_number} - 1) * {page_size};
代码说明
PARTITION BY DATE(task_complete_date):把数据按日期分组(如果task_complete_date是 datetime 类型,用DATE()提取纯日期部分)。ROW_NUMBER() OVER(...):给每个分组内的记录按日期排序后编号,这样每个日期下的前25条会被标记为1-25。- 最后用
LIMIT和OFFSET实现分页,替换{page_size}和{page_number}为你的实际分页参数(比如每页展示100条,取第2页的话就是LIMIT 100 OFFSET 100)。
兼容旧版MySQL(无窗口函数)的方案
如果你的MySQL版本低于8.0,不支持窗口函数,可以用子查询+变量的方式实现:
-- 先给每个日期的记录编号 SELECT t.* FROM ( SELECT *, @row_num := IF(@current_date = DATE(task_complete_date), @row_num + 1, 1) AS row_num, @current_date := DATE(task_complete_date) FROM tasks_complete, (SELECT @row_num := 0, @current_date := '') AS init ORDER BY DATE(task_complete_date) ) AS t WHERE t.row_num <= 25 -- 分页 ORDER BY DATE(task_complete_date), t.row_num LIMIT {page_size} OFFSET ({page_number} - 1) * {page_size};
这样就能先确保每个日期最多只有25条数据,再把这些数据统一分页输出啦。
内容的提问来源于stack exchange,提问作者user12978881
相关产品推荐
相关产品推荐

