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

mysql - perlu dua batasan?

Anda harus melakukannya dengan menerapkan "peringkat" per distrik, lalu ambil hanya per peringkat =1... @LastDistrict di lokasi bergabung didefaultkan ke nol, jika distrik didasarkan pada ID. Jika distrik berbasis karakter, Anda dapat mengubahnya menjadi ="" agar sesuai dengan tipe data.

Untuk memperjelas apa yang terjadi. Pra-kueri "AwardCounts" melakukan seluruh kueri per distrik dan anggota dengan berapa pun jumlah penghargaan. Kemudian, diurutkan berdasarkan distrik dan jumlah penghargaan anggota (menurun), sehingga menempatkan jumlah penghargaan tertinggi di posisi pertama per distrik.

Itu bergabung dengan alias palsu lain "SQLVars" yang hanya membuat variabel sebaris ke kueri yang disebut @RankSeq dan @LastDistrict. Jadi, pertama kali masuk, "DistRankSeq" akan menjadi 1 untuk distrik pertama, lalu prima "@LastDistrict" dengan nilai distriknya. Entri berikutnya untuk distrik yang sama (karena akan berada dalam urutan urutan yang benar) akan diberi peringkat 2, lalu 3, dll... Ketika ada perubahan dari apa pun Distrik "TERAKHIR" ke rekor baru menjadi diuji, peringkat akan diatur kembali ke 1 dan mulai dari awal lagi. Jadi Anda bisa memiliki satu distrik dengan 100 anggota, yang lain dengan 5, yang lain dengan 17...

Jadi, kueri terakhir Anda memiliki semuanya dengan peringkat masing-masing... Sekarang, terapkan HAVING the final district rank =1... Dengan melakukan ini, Anda juga dapat menyesuaikan keharusan untuk mendapatkan 3 anggota teratas per distrik (misalnya )...

select
      AwardCounts.District,
      AwardCounts.MemberName,
      AwardCounts.memberAwards,
      @RankSeq := if( @LastDistrict = AwardCounts.District, @RankSeq +1, 1 ) DistRankSeq,
      @LastDistrict := AwardCounts.District as ignoreIt
   from
      ( select 
              a.district,
              a.membername,
              count(*) as memberAwards
           from
              Awards a
           group by
              a.district,
              a.membername
           order by
              a.district,
              memberAwards desc ) AwardCounts

      JOIN (select @RankSeq := 0, @LastDistrict = 0 ) SQLVars
   HAVING
      DistRankSeq = 1

EDIT PER UMPAN BALIK Jika agregasinya memakan waktu, maka saya akan melakukan hal berikut. Buat tabel baru dengan hanya agregasi per distrik, nama, dan peringkat awal untuk distrik. Saat setiap catatan baru ditambahkan ke tabel ini, pemicu kemudian menambahkan satu ke jumlah tabel agregat, lalu memeriksa di mana orang itu berada dalam distrik mereka dan memperbarui kembali posisi peringkat barunya. Anda dapat melangkah lebih jauh dan memiliki tabel lain yang hanya berisi anggota "TOP" per tabel distrik yaitu satu tabel per distrik dengan nama orang tersebut. Ketika orang baru mencapai posisi teratas, nama mereka dimasukkan ke dalam tabel, menimpa siapa pun yang terakhir berada di sana.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa cara terbaik untuk menyisipkan banyak baris di PHP PDO MYSQL?

  2. Mengubah kunci utama MySQL ketika ada batasan kunci asing

  3. Beberapa pengiriman email dengan lampiran - repost

  4. Pustaka Javascript yang memungkinkan kueri seperti SQL pada data JSON?

  5. MYSQL TINYBLOB vs LONGBLOB