Đây là một cách để thực hiện việc này, sử dụng UNION ALL
(Xem SQL Fiddle với Demo
). Điều này hoạt động với hai nhóm, nếu bạn có nhiều hơn hai nhóm, thì bạn sẽ cần chỉ định group
đánh số và thêm các truy vấn cho mỗi group
:
(
select *
from mytable
where `group` = 1
order by age desc
LIMIT 2
)
UNION ALL
(
select *
from mytable
where `group` = 2
order by age desc
LIMIT 2
)
Có nhiều cách khác nhau để thực hiện việc này, hãy xem bài viết này để xác định con đường tốt nhất cho tình huống của bạn:
http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
Chỉnh sửa:
Điều này cũng có thể hiệu quả với bạn, nó tạo ra một số hàng cho mỗi bản ghi. Sử dụng một ví dụ từ liên kết ở trên, điều này sẽ chỉ trả về những bản ghi có số hàng nhỏ hơn hoặc bằng 2:
select person, `group`, age
from
(
select person, `group`, age,
(@num:=if(@group = `group`, @num +1, if(@group := `group`, 1, 1))) row_number
from test t
CROSS JOIN (select @num:=0, @group:=null) c
order by `Group`, Age desc, person
) as x
where x.row_number <= 2;
Xem Demo