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.