Những gì bạn đang cố gắng làm là chọn một số bản ghi cho mỗi nhóm. Điều này có thể được thực hiện bằng cách sử dụng các biến trong truy vấn của bạn tương tự như sau:
select *
from
(
SELECT sid,
state,
votes,
@prev := @curr,
@curr := state,
@rank := IF(@prev = @curr, @rank+1, 1) AS rank
FROM
(
select t1.sid, state, votes
FROM table1 t1
INNER JOIN table2 t2
ON t1.sid=t2.sid
) src, (SELECT @curr := null, @prev := null, @rank := 1) r
ORDER BY state, votes desc
) src
where rank <= 2
order by state, votes;
Có những cách khác để thực hiện việc này được nêu ở đây:
Sử dụng LIMIT trong GROUP BY để nhận được N kết quả cho mỗi nhóm?