私はそれを解決すると思います:)
最初に、あなたが始めた方法に基づいた1つの解決策があります。しかし、person_idごとに正確な3行(または、たとえば3つを選択した場合)を表示するために解決できなかった問題があります。問題は、解決策が、現在の行よりも大きいrating_averageで行がいくつあるかをカウントすることに基づいていることです。したがって、同じ上位値が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行を表示します)...これがフィドル 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
これがその
GL!
P. S.英語で申し訳ありませんが、私が話していることを理解していただければ幸いです...