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

如何在PHP中按月份对SQL查询的travelTimes表记录进行分组排序

最优解决方案

优先推荐:SQL端直接完成分组处理

数据库对日期处理、分组的效率远高于PHP侧拉取全表后二次处理,同时天然解决跨年分组错误的问题,实现逻辑如下:

步骤1:查询时生成年月分组标识

通过MySQL的DATE_FORMAT函数将日期格式化为年-月的字符串作为分组标识,避免仅用月份导致的跨年混淆:

SELECT 
    *,
    DATE_FORMAT(`time`, '%Y-%m') AS month_tag
FROM travelTimes
ORDER BY month_tag ASC, `time` ASC

可选:数据量较大时分批次查询

如果表内数据量超过1万条,可先查询所有存在数据的年月列表,再分批拉取对应月份的数据,避免PHP内存溢出:

-- 先获取所有有数据的年月
SELECT DISTINCT DATE_FORMAT(`time`, '%Y-%m') AS month_tag
FROM travelTimes
ORDER BY month_tag ASC

拿到年月列表后遍历每个值,查询对应月份的记录即可:

SELECT * FROM travelTimes 
WHERE DATE_FORMAT(`time`, '%Y-%m') = '2024-05'

备选方案:PHP侧完成分组

如果必须先拉取全表再做处理,修正之前的代码逻辑,用「年-月」作为分组键解决跨年问题:

$groupedTravelTimes = [];
foreach($travelTimes as $travelTime){
    // 生成带年份的分组键,彻底解决跨年分组错误
    $monthKey = date('Y-m', strtotime($travelTime['time']));
    $groupedTravelTimes[$monthKey][] = $travelTime;
}

// 遍历分组数组生成对应图表,有多少个分组就生成多少个图表
foreach($groupedTravelTimes as $month => $monthRecords){
    // 此处将$monthRecords传入图表组件渲染即可
}

补充说明

  • 如需调整月份展示顺序,可在遍历分组前通过ksort($groupedTravelTimes)(正序)或krsort($groupedTravelTimes)(倒序)对分组键排序。
  • 该方案仅适合小数据量场景,数据量较大时强烈建议使用SQL侧方案。

内容的提问来源于stack exchange,提问作者Patrik Vörös

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:24:03