Вы можете получить все данные строки, объединяющие ORDER BY
и LIMIT 1
.В вашем случае, используйте это дважды и в сочетании с 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
)
Другой способ - определить максимальный возраст мужчин и женщин (с подзапросами):
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'
)
)
Если у вас более двух родов или вы предпочитаете не задавать жесткие константы 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-й даст вам только один мужчина и только один женский результат (максимум).2-й и 3-й запрос даст вам более одного, если есть много (мужчин) с одинаковым максимальным возрастом и аналогично для женщин.
Индекс на (gender, age)
поможет любому запросу.