正しい解決策は次のとおりです。
SELECT o.*
FROM `Persons` o # 'o' from 'oldest person in group'
LEFT JOIN `Persons` b # 'b' from 'bigger age'
ON o.Group = b.Group AND o.Age < b.Age
WHERE b.Age is NULL # bigger age not found
仕組み:
o
の各行に一致します b
のすべての行 列Group
に同じ値があります Age
列の値が大きくなります 。 o
の任意の行 Age
列にグループの最大値がありません b
の1つ以上の行に一致します 。
LEFT JOIN
グループ内の最も古い人(グループ内で一人でいる人を含む)をNULL
でいっぱいの行と一致させます s b
から (「グループ内で最大の年齢はありません」)。
INNER JOIN
の使用 これらの行は一致せず、無視されます。
WHERE
句は、NULL
を持つ行のみを保持します s b
から抽出されたフィールド 。彼らは各グループの最年長者です。
さらなる読み物
このソリューションと他の多くのソリューションは、本 SQLアンチパターン:データベースプログラミングの落とし穴の回避で説明されています。