Bạn có thể lấy tất cả dữ liệu của một hàng kết hợp ORDER BY
và LIMIT 1
. Trong trường hợp của bạn, sử dụng điều này hai lần và kết hợp với 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
)
Một cách khác là tính tuổi tối đa của nam và nữ (với truy vấn phụ):
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'
)
)
Nếu bạn có nhiều hơn 2 giới tính hoặc nếu bạn không muốn mật mã cứng Male
và Female
hằng số trong truy vấn, điều này có thể được viết lại thành:
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
Các truy vấn trên có một sự khác biệt chính. Kết quả đầu tiên sẽ cho bạn chỉ một kết quả nam và một kết quả nữ (nhiều nhất). Truy vấn thứ 2 và thứ 3 sẽ cung cấp cho bạn nhiều hơn một khi có nhiều (nam) có cùng độ tuổi tối đa và tương tự đối với nữ.
Chỉ mục về (gender, age)
sẽ giúp một trong hai truy vấn.