Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

तालिका में शामिल होने के साथ MySQL ग्रेटेस्ट एन परिणाम

मुझे लगता है कि मैं इसे हल करता हूं :)

सबसे पहले यहां एक समाधान है जिस तरह से आपने शुरू किया था। लेकिन एक पकड़ है जिसे मैं प्रत्येक व्यक्ति_आईडी के लिए सटीक 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. मेरी अंग्रेजी के लिए खेद है आशा है कि आप समझ सकते हैं कि मैं किस बारे में बात कर रहा था...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस वस्तुओं या सरणियों के रूप में परिणाम देता है?

  2. स्प्रिंग बूट CLIENT_PLUGIN_AUTH आवश्यक है

  3. MySQL index_length बाइट्स में है?

  4. MYSQL में LIKE और =के बीच अंतर?

  5. MySQL में ट्रेलिंग व्हाइटस्पेस कैसे निकालें