Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Hasil N Terbaik MySQL dengan Tabel Gabung

saya pikir saya menyelesaikannya :)

Pertama di sini adalah salah satu solusi berdasarkan cara Anda memulai. Tetapi ada masalah yang tidak dapat saya selesaikan untuk menunjukkan baris 3 yang tepat (atau nomor apa pun yang Anda pilih, saya pilih 3 misalnya) untuk setiap person_id. Masalahnya adalah solusi itu didasarkan pada penghitungan berapa banyak baris yang ada dengan rating_average lebih besar dari baris saat ini. Jadi jika Anda memiliki 5 nilai teratas yang sama, Anda dapat memilih untuk menampilkan semua 5 atau tidak menampilkannya sama sekali dan itu tidak baik. Jadi begini caranya... (tentu saja ini contoh di mana jika Anda memiliki 4 nilai teratas Anda menunjukkan semuanya (saya pikir tidak masuk akal sama sekali untuk tidak menampilkan data))...

 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

Penting: Solusi ini dapat berfungsi (untuk menampilkan 3 baris tepat untuk setiap orang) jika Anda tidak memiliki nilai yang mengulanginya sendiri... Ini adalah Fiddle http://sqlfiddle.com/#!9/eb0fd/64 Anda dapat melihat masalah di mana person_id adalah 1!

Setelah itu saya bermain sedikit lagi dan membuatnya bekerja seperti yang Anda inginkan dalam pertanyaan saya pikir. Berikut adalah kode untuk itu:

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

Ini adalah Fiddle untuk http://sqlfiddle.com/#!9/eb0fd/65 ...

GL!

P. S. maaf untuk bahasa Inggris saya harap Anda bisa mengerti apa yang saya bicarakan...




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menghindari kata-kata yang dicadangkan yang digunakan sebagai nama kolom? MySQL/Buat Tabel

  2. Jalankan kueri SQL pada startup layanan MySQL

  3. Pembuat kueri tidak memasukkan stempel waktu

  4. CI - tampilkan kesalahan atau kegagalan basis data

  5. Flask-SQLAlchemy:Tidak dapat terhubung kembali sampai transaksi yang tidak valid dibatalkan