Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Най-добрите N резултати с Join Tables

мисля, че ще го реша :)

Първо ето едно решение въз основа на начина, по който сте започнали. Но има една уловка, която не можах да я реша, за да покажа точните 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. извинявам се за моя английски, надявам се, че можете да разберете за какво говоря...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. C# параметризирана заявка MySQL с клауза „in“.

  2. Spring Boot JPA MySQL:Неуспешно определяне на подходящ клас драйвер

  3. TIMEDIFF() срещу SUBTIME() в MySQL:Каква е разликата?

  4. Функция MySQL RADIANS() – Преобразуване от градуси в радиани

  5. Как да убия MySQL връзки