мисля, че ще го реша :)
Първо ето едно решение въз основа на начина, по който сте започнали. Но има една уловка, която не можах да я реша, за да покажа точните 3 (или каквото число, което изберете, избирам 3 например) ред за всеки person_id. Проблемът е, че решението се основава на преброяване на броя на реда, като рейтингът е по-голям от текущия ред. Така че, ако имате 5 с еднаква най-висока стойност, можете да изберете да покажете всичките 5 или да не ги показвате изобщо и това не е добре. Ето как го правите... (разбира се, това е пример, при който ако имате 4 най-високи стойности, вие ги показвате всички (мисля, че няма смисъл да не се показват данните))...
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
Важно: Това решение може да работи (за показване на точни 3 реда за всеки човек), ако нямате стойност, която да се повтаря... Ето го Fiddle http://sqlfiddle.com/#!9/eb0fd/64 можете да видите проблема, когато person_id е 1!
След това играх още малко и го накарах да работи точно както искаше във въпроса според мен. Ето код за това:
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
Ето цигулката за този http://sqlfiddle.com/#!9/eb0fd/65 ...
GL!
P. S. извинявам се за моя английски, надявам се, че можете да разберете за какво говоря...