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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-17 02:32:031005ブラウズ

How to Efficiently Retrieve the Last Row of Each Group in MySQL?

MySQL の各 'Group By' の '最後の' 行を返す

MySQL でグループ化された各セットの最後の行を効率的に取得するには、共通のタスク。以前のアプローチでは、WHERE 句内でサブクエリを使用するクエリが提案されていました:

select * 
    from foo as a
    where a.id = (select max(id) from foo where uid = a.uid group by uid)
    group by uid;

ただし、別のソリューションによりパフォーマンスが向上する可能性があります:

SELECT t1.* FROM foo t1
  JOIN (SELECT uid, MAX(id) id FROM foo GROUP BY uid) t2
    ON t1.id = t2.id AND t1.uid = t2.uid;

このクエリは、JOIN 操作を利用して明示的に元のテーブル (「foo」) を、各一意のユーザー ID の最大 ID 値を含む派生テーブルと結合します。 ON 句により、ID とユーザー ID が一致する行のみが結合されます。

クエリをさらに最適化するには、グループ化と結合に使用される「uid」列にインデックスを作成することをお勧めします。 。 EXPLAIN を利用すると、クエリの実行計画について洞察が得られ、潜在的なパフォーマンスのボトルネックを特定できます。

LEFT JOIN 演算子を使用する別のアプローチでも、目的の結果を得ることができます。

SELECT t1.* FROM foo t1
  LEFT JOIN foo t2
    ON t1.id < t2.id AND t1.uid = t2.uid
WHERE t2.id is NULL;

このクエリではの場合、LEFT JOIN は外部結合を実行し、「uid」および「id」基準に基づいて「foo」の行を照合します。 WHERE 句により、同じグループ内で後続行のない行のみが選択されるようになり、各ユーザー ID の最後の行が効果的に返されます。

代替アプローチを検討し、インデックス作成と EXPLAIN 分析を通じてクエリを最適化することで、 MySQL の各「group by」の最後の行を効率的に取得することが可能です。

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

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