Du kan få all data för en rad genom att kombinera ORDER BY
och LIMIT 1
. I ditt fall, använd detta två gånger och kombinera med 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
)
Ett annat sätt är att hitta den maximala åldern för män och kvinnor (med underfrågor):
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'
)
)
Om du har fler än 2 kön eller om du föredrar att inte hårdkoda Male
och Female
konstanter i frågan, kan detta skrivas om som:
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
Ovanstående frågor har en huvudsaklig skillnad. Den 1:a ger dig endast ett manligt och endast ett kvinnligt resultat (högst). Den 2:a och 3:e frågan ger dig mer än en när det finns många (män) med samma maxålder och liknande för kvinnor.
Ett index på (gender, age)
hjälper båda frågorna.