sql >> Database teknologi >  >> RDS >> Mysql

MySQL bedste N-resultater med Join-tabeller

jeg tror jeg løser det :)

Først her er en løsning baseret på den måde, du startede på. Men der er en fangst, jeg ikke kunne løse den til at vise nøjagtig 3 (eller hvilket nummer du vælger, jeg vælger f.eks. 3) række for hver person_id. Problemet er, at løsningen er baseret på at tælle, hvor mange rækker der er med rating_average større end den nuværende række. Så hvis du har 5 samme topværdi, kan du vælge at vise alle 5 eller slet ikke at vise dem, og det er ikke godt. Så her er måden du gør det på... (selvfølgelig er dette et eksempel, hvor du viser dem alle, hvis du har 4 topværdier (jeg synes, det giver overhovedet ingen mening at lade være med at vise dataene))...

 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

Vigtigt: Denne løsning kan fungere (for at vise nøjagtige 3 rækker for hver person), hvis du ikke har værdi, der gentager det selv... Her er violinen http://sqlfiddle.com/#!9/eb0fd/64 du kan se problemet, hvor person_id er 1!

Derefter spillede jeg lidt mere og fik det til at virke lige som du ville i spørgsmålet, tror jeg. Her er en kode til det:

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

Her er violinen til den http://sqlfiddle.com/#!9/eb0fd/65 ...

GL!

P. S. undskyld mit engelske håb, du kunne forstå, hvad jeg talte om...




  1. Oracle/SQL:Hvorfor forespørger SELECT * FROM records WHERE rownum>=5 AND rownum <=10 - returnerer nul rækker

  2. <expr> forventet, fik '?'

  3. MySql Bulk indsæt

  4. viser link i php