tôi nghĩ tôi giải quyết được nó :)
Đầu tiên, đây là một giải pháp dựa trên cách bạn bắt đầu. Nhưng có một vấn đề mà tôi không thể giải quyết được là hiển thị hàng 3 chính xác (hoặc bất kỳ số nào bạn chọn, tôi chọn 3 chẳng hạn) cho mỗi người_id. Vấn đề là giải pháp dựa trên việc đếm xem có bao nhiêu hàng với giá trị trung bình lớn hơn hàng hiện tại. Vì vậy, nếu bạn có 5 giá trị hàng đầu giống nhau, bạn có thể chọn hiển thị cả 5 hoặc không hiển thị chúng và điều đó không tốt. Vì vậy, đây là cách bạn làm điều đó ... (tất nhiên đây là ví dụ trong đó nếu bạn có 4 giá trị hàng đầu, bạn sẽ hiển thị tất cả chúng (tôi nghĩ rằng không có ý nghĩa gì khi không hiển thị dữ liệu)) ...
SELECT t1.person_id, t1.credit_id, t1.media_id, t1.rating_average
FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id,
m.rating_average AS rating_average
FROM person p
INNER JOIN credit c ON c.person_id = p.id
INNER JOIN media m ON m.id = c.media_id) as t1
WHERE (SELECT COUNT(*)
FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id,
m.rating_average AS rating_average
FROM person p
INNER JOIN credit c ON c.person_id = p.id
INNER JOIN media m ON m.id = c.media_id) AS t2
WHERE t2.person_id = t1.person_id AND t2.rating_average > t1.rating_average) < 3
ORDER BY person_id ASC, rating_average DESC
Quan trọng: Giải pháp này có thể hoạt động (hiển thị 3 hàng chính xác cho mỗi người) nếu bạn không có giá trị tự lặp lại ... Đây là Fiddle http://sqlfiddle.com/#!9/eb0fd/64 bạn có thể thấy sự cố khi person_id là 1!
Sau đó, tôi chơi nhiều hơn một chút và làm cho nó hoạt động như bạn muốn trong câu hỏi mà tôi nghĩ. Đây là mã cho điều đó:
SET @num := 0, @person := 0;
SELECT person_id, credit_id, media_id, rating_average, rowNumber
FROM (SELECT t1.person_id, t1.credit_id, t1.media_id, t1.rating_average,
@num := if(@person = t1.person_id, @num + 1, 1) AS rowNumber,
@person := t1.person_id
FROM (SELECT p.id AS person_id, c.id AS credit_id, m.id AS media_id,
m.rating_average AS rating_average
FROM person p
INNER JOIN credit c ON c.person_id = p.id
INNER JOIN media m ON m.id = c.media_id
ORDER BY p.id ASC, m.rating_average DESC) as t1) as t2
WHERE rowNumber <= 3
Đây là Fiddle cho http://sqlfiddle.com/#!9/eb0fd/65 ...
GL!
P. S. xin lỗi vì tiếng Anh của tôi, hy vọng bạn có thể hiểu những gì tôi đang nói về ...