SQL クエリで欠落している IN 値を処理するためのデフォルトの結果
SQL では、一連の値に基づいて行をフィルタリングするために IN クエリが使用されます。ただし、動的クエリに使用する場合は、IN リスト内の一部の値がデータベース内に対応するレコードを持たない可能性がある状況に対処する必要がある場合があります。これにより、これらの値の行が空になり、後続の処理やデータ表示に影響します。
この問題を解決するには、LEFT JOIN を使用してクエリを書き直すことを検討してください。 (提供されたサンプル コードに示すように) 条件を WHERE 句から LEFT JOIN の ON 句に移動すると、IN リスト内のすべての値が結果セットに確実に含まれるようになります。これは、LEFT JOIN は、右側のテーブルに一致する行がない場合でも、左側のテーブルのすべての行を返すためです。
例:
次の簡略化されたクエリを考えてみましょう:
<code class="language-sql">SELECT Name, ID, SUM(Minutes) AS MinutesOnline FROM UserTable LEFT JOIN OnlineUseage ON OnlineUseage.ID = UserTable.ID WHERE UserTable.ID IN (332, 554, 5764, 11, 556, ...)</code>
このクエリでは、条件 OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date
が省略されています。完全を期すために、それを JOIN 条件に含める必要があります。
改善されたクエリは次のとおりです:
<code class="language-sql">SELECT Name, ID, IFNULL(SUM(Minutes), 0) AS MinutesOnline FROM UserTable LEFT JOIN OnlineUseage ON OnlineUseage.ID = UserTable.ID AND OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date < CURRENT_TIMESTAMP WHERE UserTable.ID IN (332, 554, 5764, 11, 556, ...)</code>
OnlineUseage
テーブルに対応するレコードがない IN リストの値に対して、LEFT JOIN は対応する列の NULL 値を返します。その後、IFNULL 関数を使用して、NULL 値をデフォルト値 (この場合は 0) に置き換えることができます。
このアプローチにより、IN リスト内のすべての値が結果セットに含まれることが保証され、指定された基準を満たさない値には適切なデフォルト値が割り当てられます。 CURRENT_TIMESTAMP
は、クエリが正しく実行されるように、元のテキスト内のあいまいな <p>Now
を置き換えるために使用されることに注意してください。
以上がSQL クエリで IN 値が欠落している場合にデフォルトの結果を返す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。