Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Kết quả N tuyệt vời nhất của MySQL với các bảng tham gia

tôi nghĩ tôi giải quyết được nó :)

Đầu tiên, đây là một giải pháp dựa trên cách bạn bắt đầu. Nhưng có một vấn đề mà tôi không thể giải quyết được là hiển thị hàng 3 chính xác (hoặc bất kỳ số nào bạn chọn, tôi chọn 3 chẳng hạn) cho mỗi người_id. Vấn đề là giải pháp dựa trên việc đếm xem có bao nhiêu hàng với giá trị trung bình lớn hơn hàng hiện tại. Vì vậy, nếu bạn có 5 giá trị hàng đầu giống nhau, bạn có thể chọn hiển thị cả 5 hoặc không hiển thị chúng và điều đó không tốt. Vì vậy, đây là cách bạn làm điều đó ... (tất nhiên đây là ví dụ trong đó nếu bạn có 4 giá trị hàng đầu, bạn sẽ hiển thị tất cả chúng (tôi nghĩ rằng không có ý nghĩa gì khi không hiển thị dữ liệu)) ...

 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

Quan trọng: Giải pháp này có thể hoạt động (hiển thị 3 hàng chính xác cho mỗi người) nếu bạn không có giá trị tự lặp lại ... Đây là Fiddle http://sqlfiddle.com/#!9/eb0fd/64 bạn có thể thấy sự cố khi person_id là 1!

Sau đó, tôi chơi nhiều hơn một chút và làm cho nó hoạt động như bạn muốn trong câu hỏi mà tôi nghĩ. Đây là mã cho điều đó:

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

Đây là Fiddle cho http://sqlfiddle.com/#!9/eb0fd/65 ...

GL!

P. S. xin lỗi vì tiếng Anh của tôi, hy vọng bạn có thể hiểu những gì tôi đang nói về ...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để chèn nhiều hàng trong một câu lệnh chèn?

  2. PHP, PDO, MySQL, Thông báo:Đang cố gắng lấy thuộc tính của non-object

  3. Tại sao Rails lại thêm `OR 1 =0` vào các truy vấn bằng cách sử dụng cú pháp băm mệnh đề where với một phạm vi?

  4. java.sql.Connection mở rộng cho SSH

  5. Truy vấn bảng chéo động MySQL:Chọn bản ghi con làm cột bổ sung