正しい解決策は次のとおりです。
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アンチパターン:データベースプログラミングの落とし穴の回避で説明されています。