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
相关产品推荐
相关产品推荐

