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

MySQL分组查询:获取被分组的原始行数需求

解决方案

没问题,这需求很常见,咱们直接调整你的SQL语句就能实现合并记录并统计原始行数的效果。

修改后的查询语句

SELECT 
    bo.iBookingId,
    bo.vBookingNo,
    ro.*,
    bu.*,
    COUNT(*) AS Count
FROM `bookings` bo 
LEFT JOIN routes ro ON bo.iRouteId = ro.iRouteId 
LEFT JOIN buses bu ON bo.iBusId = bu.iBusId 
WHERE eBookingBy = 'User' AND iUserId = '2' 
GROUP BY bo.vBookingNo
ORDER BY bo.iBookingId DESC

核心改动说明

  • COUNT(*) AS Count:这个聚合函数会精准统计每个vBookingNo分组下的原始记录数量,对应你需要的Count=2结果。
  • GROUP BY bo.vBookingNo:按照预订编号对结果分组,自动把相同编号的多条记录合并成单条。

适配严格SQL模式的规范写法

如果你的MySQL开启了ONLY_FULL_GROUP_BY模式(这是很多生产环境的默认配置),SELECT子句里的非聚合字段必须是分组字段,或者用聚合函数明确取值逻辑。比如如果同一vBookingNo下的关联表字段(比如线路名、车牌号)都一致,用MAX()或MIN()取任意值即可:

SELECT 
    MAX(bo.iBookingId) AS iBookingId,
    bo.vBookingNo,
    MAX(ro.sRouteName) AS sRouteName, -- 替换为routes表实际字段
    MAX(bu.vBusNumber) AS vBusNumber, -- 替换为buses表实际字段
    COUNT(*) AS Count
FROM `bookings` bo 
LEFT JOIN routes ro ON bo.iRouteId = ro.iRouteId 
LEFT JOIN buses bu ON bo.iBusId = bu.iBusId 
WHERE eBookingBy = 'User' AND iUserId = '2' 
GROUP BY bo.vBookingNo
ORDER BY MAX(bo.iBookingId) DESC

这样调整后,既能得到合并后的单条记录,又能正确返回分组前的原始行数啦。

内容的提问来源于stack exchange,提问作者TarangP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:25:50