Giải pháp chính xác là:
SELECT o.*
FROM `Persons` o # 'o' from 'oldest person in group'
LEFT JOIN `Persons` b # 'b' from 'bigger age'
ON o.Group = b.Group AND o.Age < b.Age
WHERE b.Age is NULL # bigger age not found
Cách hoạt động:
Nó khớp với từng hàng từ o
với tất cả các hàng từ b
có cùng giá trị trong cột Group
và giá trị lớn hơn trong cột Age
. Bất kỳ hàng nào từ o
không có giá trị lớn nhất của nhóm trong cột Age
sẽ khớp với một hoặc nhiều hàng từ b
.
LEFT JOIN
làm cho nó khớp với người lớn tuổi nhất trong nhóm (bao gồm cả những người ở một mình trong nhóm của họ) với một hàng đầy NULL
s từ b
('không có độ tuổi lớn nhất trong nhóm').
Sử dụng INNER JOIN
làm cho các hàng này không khớp và chúng bị bỏ qua.
WHERE
mệnh đề chỉ giữ các hàng có NULL
s trong các trường được trích xuất từ b
. Họ là những người lớn tuổi nhất trong mỗi nhóm.
Các bài đọc thêm
Giải pháp này và nhiều giải pháp khác được giải thích trong cuốn sách Phản văn bản SQL:Tránh cạm bẫy của lập trình cơ sở dữ liệu