このチュートリアルでは、グループの最大値または最小値を持つレコードを取得する方法について説明します。ランキング (@Rank) に依存せずに、各グループ内の指定されたフィールド。この最初の質問では解決策として @Rank が使用されていましたが、その後の回答では結合を使用したより効率的なアプローチが示されています。
各グループの最も高い OrderField を持つ行を取得するには、左外部メソッドを使用します。 join と次のクエリ:
SELECT t1.* FROM `Table` AS t1 LEFT OUTER JOIN `Table` AS t2 ON t1.GroupId = t2.GroupId AND t1.OrderField < t2.OrderField WHERE t2.GroupId IS NULL ORDER BY t1.OrderField;
グループ内で複数のレコードに同じ OrderField があり、そのうちの 1 つが必要な場合は、条件を拡張できます。
SELECT t1.* FROM `Table` AS t1 LEFT OUTER JOIN `Table` AS t2 ON t1.GroupId = t2.GroupId AND (t1.OrderField < t2.OrderField OR (t1.OrderField = t2.OrderField AND t1.Id < t2.Id)) WHERE t2.GroupId IS NULL
この洗練されたクエリにより、同じグループ GroupId 内に、より高い OrderField 値、またはより低い Id 値を持つ等しい OrderField を持つ他の行 t2 が存在しない場合にのみ、t1 が返されることが保証されます。したがって、各グループ内で最大の OrderField を持つ行を効果的に取得します。
左外部結合アプローチを使用すると、@Rank とサブクエリを含む以前の方法と比較して、クエリのパフォーマンスを大幅に向上させることができます。左外部結合は、アクセスを最適化するために (GroupId、OrderField) のインデックスを利用できます。
@Rank を使用した最初のアプローチは、次のような事実により期待どおりに機能しない可能性があります。 @Rank の増分は、最初のテーブルが処理された後も続行されます。テーブル間で @Rank を 0 にリセットするには、追加の派生テーブルを導入する必要がありますが、これにより最適化が不十分になる可能性があります。
以上がランキング関数を使用せずに SQL でグループごとの最小値と最大値を効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。