saya pikir saya menyelesaikannya :)
Pertama di sini adalah salah satu solusi berdasarkan cara Anda memulai. Tetapi ada masalah yang tidak dapat saya selesaikan untuk menunjukkan baris 3 yang tepat (atau nomor apa pun yang Anda pilih, saya pilih 3 misalnya) untuk setiap person_id. Masalahnya adalah solusi itu didasarkan pada penghitungan berapa banyak baris yang ada dengan rating_average lebih besar dari baris saat ini. Jadi jika Anda memiliki 5 nilai teratas yang sama, Anda dapat memilih untuk menampilkan semua 5 atau tidak menampilkannya sama sekali dan itu tidak baik. Jadi begini caranya... (tentu saja ini contoh di mana jika Anda memiliki 4 nilai teratas Anda menunjukkan semuanya (saya pikir tidak masuk akal sama sekali untuk tidak menampilkan data))...
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
Penting: Solusi ini dapat berfungsi (untuk menampilkan 3 baris tepat untuk setiap orang) jika Anda tidak memiliki nilai yang mengulanginya sendiri... Ini adalah Fiddle http://sqlfiddle.com/#!9/eb0fd/64 Anda dapat melihat masalah di mana person_id adalah 1!
Setelah itu saya bermain sedikit lagi dan membuatnya bekerja seperti yang Anda inginkan dalam pertanyaan saya pikir. Berikut adalah kode untuk itu:
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
Ini adalah Fiddle untuk http://sqlfiddle.com/#!9/eb0fd/65 ...
GL!
P. S. maaf untuk bahasa Inggris saya harap Anda bisa mengerti apa yang saya bicarakan...