ホームページ >データベース >mysql チュートリアル >SQL の WHERE 句がパラメータを無視するのはなぜですか?
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
が「2」である university
および 'massive' の全文検索が または の最初の OR に一致する テーブルからレコードを選択することを目的としています。姓に「箱」が含まれています。 ただし、結果セットには、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 中国語 Web サイトの他の関連記事を参照してください。