मुझे लगता है कि मैं इसे हल करता हूं :)
सबसे पहले यहां एक समाधान है जिस तरह से आपने शुरू किया था। लेकिन एक पकड़ है जिसे मैं प्रत्येक व्यक्ति_आईडी के लिए सटीक 3 (या जो भी संख्या आप चुनते हैं मैं उदाहरण के लिए 3 चुनता हूं) दिखाने के लिए इसे हल नहीं कर सका। समस्या यह है कि समाधान यह गिनने पर आधारित है कि वर्तमान पंक्ति से अधिक रेटिंग_औसत के साथ कितनी पंक्तियाँ हैं। इसलिए यदि आपके पास 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
यहाँ उसके लिए फिडल है http://sqlfiddle.com/#!9/eb0fd/65 ...
जीएल!
P. S. मेरी अंग्रेजी के लिए खेद है आशा है कि आप समझ सकते हैं कि मैं किस बारे में बात कर रहा था...