MySQL COUNT查询带LIMIT/OFFSET返回空集,无COUNT查询正常问题排查
问题原因解析
你遇到的问题核心在于聚合查询(COUNT(*))和普通行查询的本质区别:
- 执行
SELECT COUNT(*)时,数据库会先聚合统计符合条件的总行数,最终只返回1行结果(即统计出的数字)。此时你加上OFFSET 50,相当于要跳过前50行,但结果总共只有1行,跳过之后自然没有数据可返回,所以结果集为空。 - 而
SELECT *是返回符合条件的所有行数据,只要符合条件的行数超过50,OFFSET 50就能跳过前50行,返回剩余的行,因此能正常得到结果。
解决办法
如果你的需求是统计跳过前50行之后的剩余行数,不能直接给COUNT(*)加OFFSET,需要先筛选出偏移后的行再统计:
SELECT COUNT(*) FROM ( SELECT * FROM STATION_METRICS WHERE metric_label = 'Pressure' AND station_id = 1 AND metric_timestamp >= '2022-11-29' AND metric_timestamp <= '2022-12-06' ORDER BY metric_timestamp ASC LIMIT 18446744073709551615 OFFSET 50 ) AS filtered_rows;
如果只是想获取符合条件的总行数,直接去掉LIMIT和OFFSET即可,这也是你移除这两个子句后能得到预期结果的原因。
内容的提问来源于stack exchange,提问作者Barracuda
相关产品推荐
相关产品推荐

