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

MySQLの各グループの最後のレコードを効率的に取得するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-25 19:36:09
オリジナル
180 人が閲覧しました

How Can I Efficiently Retrieve the Last Record in Each Group in MySQL?

mysql:各グループから最終記録を抽出します

このガイドでは、MySQLデータベース内の各グループ内の最後のレコードを取得するための効率的な方法を調査します。 MySQL 8.0および以前のバージョンに適した手法を調べます。

mysql 8.0およびウィンドウ関数:

MySQL 8.0は、ウィンドウ関数を導入し、合理化されたアプローチを提供します。 次のクエリでは、

を使用してグループ内の各レコードにランクを割り当てます。

このクエリは、ROW_NUMBER()(グループ化列)でデータをパーティション化し、各パーティションのランク1を最後のレコードに割り当てます。 ididpre-mysql 8.0テクニック:

<code class="language-sql">WITH ranked_messages AS (
  SELECT m.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC) AS rn
  FROM messages AS m
)
SELECT * FROM ranked_messages WHERE rn = 1;</code>
ログイン後にコピー

8.0以前のmysqlバージョンの場合、代替戦略が必要です。 name

メソッド1:グループ付きサブクエリ:

この方法でサブクエリを活用してデータを注文し、結果をグループ化します。

メソッド2:NULLフィルタリングで結合する左:

このアプローチでは、a

を使用して、各レコードを同じグループの他のレコードと比較します。 後続のレコードのないレコード(結合の

で示されています)は、グループの最後のレコードを表しています。

<code class="language-sql">SELECT
  *
FROM (SELECT
  *
FROM messages
ORDER BY id DESC) AS x
GROUP BY name</code>
ログイン後にコピー

パフォーマンス分析:

これらのメソッドのパフォーマンスは、データサイズとデータベースの構成によって異なります。ウィンドウ関数は一般的に効率的ですが、

メソッドは、特に大規模なデータセットの場合、LEFT JOINサブクエリよりも優れていることがよくあります。 実質的なデータセットのベンチマークテスト(たとえば、StackoverFlow 2009年8月のデータベース)は、NULLアプローチが大幅に高速であることを示しています。

<code class="language-sql">SELECT m1.*
FROM messages m1 LEFT JOIN messages m2
 ON (m1.name = m2.name AND m1.id < m2.id)
WHERE m2.id IS NULL;</code>
ログイン後にコピー
結論:

MySQL 8.0のウィンドウ関数は、エレガントでしばしば効率的なソリューションを提供します。古いMySQLバージョンの場合、

メソッドは、特に大きなテーブルを扱う場合、堅牢で頻繁に高速な代替品を提供します。 最良のアプローチは、特定のMySQLバージョンとデータセットサイズに依存します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート