MySQL比较运算符与LIMIT联用结果异常问题咨询
问题原因与解决方案
1. 为何当前SQL仅返回1条记录?
你的SQL执行逻辑顺序错误:
- 先执行
WHERE子句,过滤出日期匹配2023-02-26且金额<2000的记录 - 再对这些过滤后的记录按
invoiceId降序排序 - 最后跳过前2条,取后续6条
但你的需求是先排除全表中最新的2条记录(无关金额),再在剩余记录里筛选金额<2000的数据。当前逻辑把金额过滤放在了排除最新记录之前,导致排序分页的数据集已经是被金额筛选过的,自然无法得到预期结果。
举个实际场景:假设你的5条记录里,最新的2条(invoiceId最大的2条)中存在一条金额<2000的记录,但它被WHERE先筛选出来,排序后又被LIMIT 2,6跳过;剩余符合金额条件的仅1条,所以最终只返回1条数据。
2. 为何amount > 20000返回空,amount > 0结果正常?
- 当使用
amount > 0时,符合日期条件的记录基本都满足该条件,排除最新2条后仍有剩余数据返回 - 当使用
amount > 20000时,要么是所有符合日期条件且金额>20000的记录都属于最新的2条,被LIMIT 2,6跳过了;要么是根本不存在同时满足日期匹配+金额>20000的记录,所以返回空集。
正确SQL写法
要实现先排除最新2条、再过滤金额的逻辑,需用子查询或CTE先获取排除最新记录的数据集:
方式1:子查询(兼容多数数据库)
SELECT amount FROM ( SELECT amount, invoiceId FROM invoice WHERE invoiceDate LIKE '%2023-02-26%' ORDER BY invoiceId DESC LIMIT 2, 1000 -- 跳过最新2条,取剩余所有记录(1000足够覆盖你的数据量) ) AS filtered_invoices WHERE amount < 2000;
方式2:CTE(适用于MySQL 8+、PostgreSQL等支持的数据库)
WITH excluded_latest AS ( SELECT amount, invoiceId FROM invoice WHERE invoiceDate LIKE '%2023-02-26%' ORDER BY invoiceId DESC LIMIT 2, 1000 ) SELECT amount FROM excluded_latest WHERE amount < 2000;
这样就能先排除最新的2条记录,再在剩余数据中筛选金额<2000的内容,得到你预期的invoiceId为1157、1158的两条记录。
内容的提问来源于stack exchange,提问作者Hashi
相关产品推荐
相关产品推荐

