Você pode obter todos os dados de uma linha combinando
ORDER BY
e LIMIT 1
. No seu caso, usando isso duas vezes e combinando com 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
)
Outra maneira é encontrar a idade máxima de machos e fêmeas (com subconsultas):
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'
)
)
Se você tiver mais de 2 gêneros ou se preferir não codificar
Male
e Female
constantes na consulta, isso pode ser reescrito como: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
As consultas acima têm uma diferença principal. O 1º lhe dará apenas um resultado masculino e apenas um feminino (no máximo). A 2ª e a 3ª consulta lhe darão mais de uma quando houver muitos (homens) com a mesma idade máxima e da mesma forma para mulheres.
Um índice em
(gender, age)
ajudará qualquer uma das perguntas.