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

Bantuan MySQL:Mengoptimalkan Kueri Pembaruan yang Menetapkan Peringkat Menurut Urutan Kolom Lain

Pertama, saya akan mengubah budget , cost dan rank_score menjadi integer atau tipe data numerik lainnya dan alih-alih

UPDATE table_name
SET rank_score = CONCAT(cost, budget) ;

Maka Anda akan menggunakan:

UPDATE table_name
SET rank_score = cost * 1000 + budget * 1  ;

Lebih mudah karena Anda tidak perlu berurusan dengan fungsi string dan memiliki sesuatu seperti:

SELECT * 
FROM table_name
WHERE (conditions...)
ORDER BY rank_score DESC

(Kurung:memiliki satu parameter (1000 ) ditetapkan lebih tinggi dari yang lain (1 ) setara dengan memiliki urutan cost, budget . Coba ini untuk memeriksa:

SELECT * 
FROM table_name
ORDER BY cost DESC
       , budget DESC

Jadi, Anda bisa menurunkan rank_score semuanya, kecuali jika Anda berencana membuat eksperimen dengan berbagai nilai parameter.

Seperti yang telah ditunjukkan orang lain, bukan praktik terbaik untuk memiliki bidang yang tidak menyimpan data tetapi perhitungan. Ini de-normalisasi. Sebagai gantinya, Anda membuat tabel tetap normal dan membiarkan database melakukan perhitungan setiap kali Anda membutuhkannya:

SELECT id, budget, cost, 
       cost*1000 + budget*1 AS rank_score_calculated
FROM table_name
ORDER BY rank_score_calculated DESC

rank_score_calculated tidak disimpan dalam contoh di atas. Dengan cara ini, Anda tidak perlu memperbarui bidang terhitung setiap kali anggaran atau biaya diubah atau baris baru ditambahkan dalam tabel.

Hanya ada satu kelemahan. Jika tabel sangat besar dan Anda memerlukan kueri (dan perhitungan) yang dilakukan oleh banyak pengguna dan sangat sering, dan tabel cukup sering diperbarui, maka ini dapat memperlambat database Anda. Dalam hal ini, seseorang harus mulai berpikir untuk menambahkan bidang seperti itu.

Kasus lainnya adalah ketika seseorang membutuhkan rank absolut di semua baris tabel, seperti kebutuhan Anda. Karena MySQL tidak memiliki fungsi "jendela", sangat sulit untuk menulis kueri seperti itu dalam SQL murni.)

Peringkat dapat dihitung menggunakan variabel MySQL

SELECT *
     , @rownum:[email protected]+1 AS rank_calculated
FROM table_name
   , (SELECT @rownum:=0) AS st
ORDER BY rank_score DESC

Dan jika Anda ingin memasukkan nilai tersebut ke dalam rank , gunakan:

UPDATE table_name
         JOIN
         ( SELECT id
                , @rownum:[email protected]+1 AS rank_calculated
           FROM table_name
              , (SELECT @rownum:=0) AS st
           ORDER BY rank_score DESC
         ) AS r
         ON r.id = table_name.id
SET table_name.rank = r.rank_calculated ;

Dua kueri di atas bukan SQL murni. Anda dapat memeriksa opsi untuk pindah ke sistem daabase lain yang mendukung fungsi jendela, seperti Postgres, SQL-Server atau Oracle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySql:atur variabel dengan daftar

  2. Urutan subkueri MySQL

  3. Struktur tabel untuk Data Geo Spasial

  4. melemparkan String ke waktu sql

  5. kolom pembaruan mysql dengan nilai dari tabel lain