MySQL グループで返される行を制御する
MySQL では、データのグループから目的の行を取得することが困難になる場合があります。この記事では、シナリオごとにグループで返される行の制御を確立する方法について説明します。
問題:
データベース テーブルに、id 列で識別されるレコードの複数のバージョンが含まれています。そして version_id 列。目標は、テーブルをクエリして、一意の ID ごとに最も高い version_id を持つレコードのみを返すことです。
解決策 1 (サブクエリ アプローチ):
1 つのアプローチでは、以下を使用します。 version_id に基づいて行を降順にランク付けするサブクエリ:
SELECT * FROM (SELECT * FROM table ORDER BY version_id DESC) t1 GROUP BY t1.id
このメソッドは効果的に一時テーブルを作成し、データを並べ替えて、それをグループ化して目的の行を取得します。
解決策 2 (Max と Join を使用):
別の方法では MAX() 関数を利用し、同じ結果を得るために結合します:
SELECT * FROM (SELECT id, MAX(version_id) AS version_id FROM table GROUP BY id) t1 INNER JOIN table t2 ON t2.id = t1.id AND t1.version_id = t2.version_id
このアプローチが最初です各 ID の最大 version_id を識別し、元のテーブルを結合して、最高バージョンの完全なレコードを取得します。
利点と考慮事項:
サブクエリ アプローチでは、メモリ内の一時テーブル。大規模なデータセットのパフォーマンスに影響を与える可能性があります。一方、理解と実装はより簡単です。
結合ベースの方法は、一時テーブルの作成を避けるため、大規模なデータセットに対しては一般に効率的です。ただし、最適なパフォーマンスを得るには、(id, version_id) 列にインデックスが存在することが前提となります。
どちらのソリューションも、効率的に実行するには適切なインデックスが必要です。
以上がMySQL の GROUP BY 句で各 ID の最高バージョン レコードを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。