ORDER BY
を組み合わせた行のすべてのデータを取得できます およびLIMIT 1
。あなたの場合、これを2回使用し、UNION
と組み合わせます :
( SELECT *
FROM person
WHERE gender = 'Male'
ORDER BY age DESC
LIMIT 1
)
UNION ALL
( SELECT *
FROM person
WHERE gender = 'Female'
ORDER BY age DESC
LIMIT 1
)
もう1つの方法は、男性と女性の最大年齢を(サブクエリを使用して)指定することです。
SELECT *
FROM person
WHERE ( gender = 'Male'
AND age =
( SELECT MAX(age)
FROM person
WHERE gender = 'Male'
)
)
OR ( gender = 'Female'
AND age =
( SELECT MAX(age)
FROM person
WHERE gender = 'Female'
)
)
性別が2つ以上ある場合、またはMale
をハードコーディングしたくない場合 およびFemale
クエリ内の定数。これは次のように書き直すことができます。
SELECT p.*
FROM person AS p
JOIN
( SELECT gender
, MAX(age) AS maxage
FROM person
GROUP BY gender
) AS pg
ON pg.gender = p.gender
AND pg.maxage = p.age
上記のクエリには主な違いがあります。 1つ目は、男性1つと女性1つだけの結果を示します(多くても)。 2番目と3番目のクエリでは、最大年齢が同じで女性も同様である(男性)が多い場合に複数のクエリが表示されます。
(gender, age)
のインデックス どちらのクエリにも役立ちます。