Puedes obtener todos los datos de una fila combinando ORDER BY
y LIMIT 1
. En tu caso, usando esto dos veces y combinándolo con 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
)
Otra forma es encontrar la edad máxima de hombres y mujeres (con 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'
)
)
Si tiene más de 2 géneros o si prefiere no codificar Male
y Female
constantes en la consulta, esto se puede reescribir 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
Las consultas anteriores tienen una diferencia principal. El primero le dará solo un resultado masculino y solo uno femenino (como máximo). La segunda y la tercera consulta le darán más de uno cuando hay muchos (hombres) con la misma edad máxima y de manera similar para las mujeres.
Un índice sobre (gender, age)
ayudará a cualquier consulta.