Tôi không nghĩ rằng có một cách đơn giản trong MySQL. Một cách để làm điều này là tạo một số hàng cho mỗi hàng được phân vùng trong các nhóm theo rating_name, sau đó chỉ chọn các hàng có row_number 2 trở xuống. Trong hầu hết các cơ sở dữ liệu, bạn có thể thực hiện việc này bằng cách sử dụng một cái gì đó như:
SELECT * FROM (
SELECT
rating_name,
etc...,
ROW_NUMBER() OVER (PARTITION BY rating_name ORDER BY good) AS rn
FROM your_table
) T1
WHERE rn <= 2
Rất tiếc, MySQL không hỗ trợ ROW_NUMBER
cú pháp. Tuy nhiên, bạn có thể mô phỏng ROW_NUMBER
sử dụng các biến:
SELECT
rating_name, id_markets, good, neutral, bad
FROM (
SELECT
*,
@rn := CASE WHEN @prev_rating_name = rating_name THEN @rn + 1 ELSE 1 END AS rn,
@prev_rating_name := rating_name
FROM (
SELECT
rating_name,
id_markets,
SUM(COALESCE(rating_good, 0)) AS good,
SUM(COALESCE(rating_neutral, 0)) AS neutral,
SUM(COALESCE(rating_bad, 0)) AS bad
FROM zzratings
WHERE rating_year = YEAR(CURDATE()) AND rating_week = WEEK(CURDATE(), 1)
GROUP BY rating_name, id_markets
) AS T1, (SELECT @prev_rating_name := '', @rn := 0) AS vars
ORDER BY rating_name, good DESC
) AS T2
WHERE rn <= 2
ORDER BY rating_name, good DESC
Kết quả khi chạy trên dữ liệu thử nghiệm của bạn:
france 1 2 0 0 france 2 1 0 0 ireland 1 4 2 0 ireland 21 3 1 0 poland 1 3 1 0 poland 2 1 0 0