MySQL多条件WHERE过滤:如何编写符合指定逻辑的有效SQL语句?
修正你的MySQL查询语句
嘿,问题出在你的子查询里没带上status='normal'的过滤条件哦!当前子查询计算的是整个表中number<5的最大值,而不是仅在status='normal'的行范围内查找,这就导致主查询的status='normal'条件没起到真正的限定作用。
这里给你两种靠谱的修改方案:
方案一:修正子查询的过滤范围
把status='normal'也加到子查询里,让它只在符合状态要求的行里找最大的number:
$sqlNext = "SELECT * FROM table WHERE status='normal' AND number = (SELECT MAX(number) FROM table WHERE status='normal' AND number < 5) LIMIT 1";
这样子查询的结果就是status='normal'且number<5的最大数值,主查询再匹配这个数值和状态,就能精准拿到你要的行。
方案二:用排序+LIMIT简化逻辑
这种方式更直观,性能在数据量不大的情况下也完全够用:
$sqlNext = "SELECT * FROM table WHERE status='normal' AND number < 5 ORDER BY number DESC LIMIT 1";
思路很简单:先筛选出所有status='normal'且number<5的行,然后按number从大到小排序,取第一行就是你要的number最大的那条记录。
补充说明
如果存在多条number等于最大值的行(比如两行status='normal'且number=4),两种方案都会返回其中一行;如果需要获取所有这类行,去掉末尾的LIMIT 1即可。
内容的提问来源于stack exchange,提问作者mos2fa
相关产品推荐
相关产品推荐

