You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:32:49