SQL WHERE 子句故障排除:为什么参数被忽略
SQL 查询有时会产生意外结果,特别是当 WHERE
子句包含多个条件时。 这通常源于不正确的运算符优先级和分组。
让我们检查一下 WHERE
子句似乎忽略参数的场景:
<code class="language-sql">SELECT * FROM people WHERE university='2' AND MATCH (lname,fname) AGAINST ('+massive' IN BOOLEAN MODE) OR (fname LIKE '%box%' OR lname LIKE '%box%')</code>
此查询旨在从 people
表中选择记录,其中 university
为“2”并且对“大量”匹配的全文搜索或第一个或姓氏包含“box”。 但是,结果集可能包含不满足 university='2'
条件的条目。
问题在于 SQL 的运算符优先级:AND
优先于 OR
。 查询的隐式分组是:
<code class="language-sql">(university='2') AND ( (MATCH (lname,fname) AGAINST ('+massive' IN BOOLEAN MODE)) OR (fname LIKE '%box%' OR lname LIKE '%box%') )</code>
请注意 university='2'
仅适用于全文搜索。 为了纠正这个问题,我们需要显式括号来确保 AND
条件适用于所有部分:
<code class="language-sql">SELECT * FROM people WHERE (university='2') AND (MATCH (lname,fname) AGAINST ('+massive' IN BOOLEAN MODE) OR fname LIKE '%box%' OR lname LIKE '%box%')</code>
通过将所有条件分组在括号内,我们强制执行预期的逻辑,确保只返回满足所有指定条件的记录。 这凸显了在 SQL 中构造复杂 WHERE
子句时仔细使用括号的重要性。
以上是为什么我的 SQL WHERE 子句忽略参数?的详细内容。更多信息请关注PHP中文网其他相关文章!