mysql:各グループから最終記録を抽出します
このガイドでは、MySQLデータベース内の各グループ内の最後のレコードを取得するための効率的な方法を調査します。 MySQL 8.0および以前のバージョンに適した手法を調べます。 mysql 8.0およびウィンドウ関数:MySQL 8.0は、ウィンドウ関数を導入し、合理化されたアプローチを提供します。 次のクエリでは、
を使用してグループ内の各レコードにランクを割り当てます。
このクエリは、ROW_NUMBER()
(グループ化列)でデータをパーティション化し、各パーティションのランク1を最後のレコードに割り当てます。
id
id
pre-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
この方法でサブクエリを活用してデータを注文し、結果をグループ化します。
メソッド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 サイトの他の関連記事を参照してください。