ホームページ >データベース >mysql チュートリアル >データベース内のグループごとに最高または最低のレコードを効率的に取得するにはどうすればよいですか?

データベース内のグループごとに最高または最低のレコードを効率的に取得するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-24 22:08:11583ブラウズ

How Can I Efficiently Retrieve the Highest or Lowest Record per Group in a Database?

グループごとの最高/最低のレコードの取得

問題ステートメント

最高のレコードを効率的に取得するにはどうすればよいですかまたは、別のグループによって定義された各グループ内の特定のフィールドの最小値field?

左外部結合を使用した解決策

各 GroupId 内の OrderField フィールドの最大値を持つレコードを取得するには、次のクエリを使用します:

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;

参加のメリットアプローチ

  • 大規模なデータセットに対して効率的
  • 利用可能な場合は (GroupId、OrderField) のインデックスを使用します
  • サブクエリやデータセット内での並べ替えは必要ありませんquery

代替案

データが小さい場合、または使用しているデータベース エンジンの特定の実装が結合に対して十分に最適化されていない場合は、次のような代替案を検討できます。として:

  • サブクエリの使用: これサブクエリを使用して各グループの最大値を計算し、このサブクエリをメイン テーブルに結合して対応するレコードを取得します。
  • ランク関数の使用: これには、ウィンドウ関数を使用して各グループ内の各レコードのランクを計算し、ランクに基づいてフィルタリングします。

を使用する方法の非効率性@Rank Variable

@Rank 変数を使用して最初に記述したメソッドは、最初のテーブルの処理後に @Rank 変数がゼロにリセットされないため、正しく機能しません。これを修正するには、2 番目のテーブルを処理する前に、別の派生テーブルを追加して @Rank を 0 にリセットする必要があります。ただし、このアプローチは結合アプローチと比較すると依然として非効率的です。

以上がデータベース内のグループごとに最高または最低のレコードを効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。