ここ MySQLの公式ドキュメントの優れた記事です:
引用:
特定の列のグループごとの最大値を保持する行
タスク:記事ごとに、最も高い価格のディーラーを見つけます。
この問題は、次のようなサブクエリで解決できます。
SELECT article, dealer, price
FROM shop s1
WHERE price=(SELECT MAX(s2.price)
FROM shop s2
WHERE s1.article = s2.article);
前の例では、相関サブクエリを使用していますが、これは非効率的である可能性があります(セクション13.2.10.7「相関サブクエリ」を参照)。問題を解決するための他の可能性は、FROM句またはLEFTJOINで無相関のサブクエリを使用することです。
無相関サブクエリ:
SELECT s1.article, dealer, s1.price
FROM shop s1
JOIN (
SELECT article, MAX(price) AS price
FROM shop
GROUP BY article) AS s2
ON s1.article = s2.article AND s1.price = s2.price;
左参加:
SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.article = s2.article AND s1.price < s2.price
WHERE s2.article IS NULL;
LEFT JOINは、s1.priceが最大値の場合、それより大きい値のs2.priceはなく、s2行の値はNULLになることに基づいて機能します。