Saya memiliki tabel MySQL yang sangat sederhana tempat saya menyimpan skor tinggi. Itu terlihat seperti itu:
Id Name Score
Sejauh ini baik. Pertanyaannya adalah: Bagaimana cara saya mendapatkan peringkat pengguna? Sebagai contoh, saya memiliki pengguna Name
atau Id
dan ingin mendapatkan peringkatnya, di mana semua baris diperintahkan turun untuk Score
.
Sebuah contoh
Id Name Score
1 Ida 100
2 Boo 58
3 Lala 88
4 Bash 102
5 Assem 99
Dalam hal ini, Assem
peringkatnya adalah 3, karena ia mendapat skor tertinggi ke-3.
Kueri harus mengembalikan satu baris, yang berisi (hanya) Peringkat yang diperlukan.
(SELECT GROUP_CONCAT(score) FROM TheWholeTable)
bukan cara terbaik. Dan itu mungkin memiliki masalah dengan ukuran baris yang dibuat.SELECT 1 + COUNT(*) AS rank FROM scores WHERE score > (SELECT score FROM scores WHERE name='Assem')
. Yang 'hanya' menghitung jumlah entri dengan skor lebih tinggi dari entri saat ini. (Jika Anda menambahkanDISTINCT
Anda akan mendapatkan pangkat tanpa celah ..)Ketika beberapa entri memiliki skor yang sama, peringkat berikutnya tidak boleh berturut-turut. Peringkat berikutnya harus ditambah dengan jumlah skor yang memiliki peringkat yang sama.
Untuk menampilkan skor seperti itu diperlukan dua variabel peringkat
Ini adalah versi peringkat yang lebih stabil dengan ikatan:
Mari kita coba ini dengan data sampel. Pertama di sini adalah data sampel:
Mari memuat data sampel
Selanjutnya, mari inisialisasi variabel pengguna:
Sekarang, ini adalah output dari query:
Harap perhatikan bagaimana beberapa ID yang memiliki skor yang sama memiliki peringkat yang sama. Perhatikan juga bahwa peringkat tidak berurutan.
Cobalah !!!
sumber
sumber
Salah satu opsi adalah menggunakan variabel USER:
sumber
The jawaban yang diterima memiliki masalah potensial. Jika ada dua atau lebih skor identik, akan ada kesenjangan dalam peringkat. Dalam contoh yang dimodifikasi ini:
Skor 58 memiliki peringkat 5, dan tidak ada peringkat 4.
Jika Anda ingin memastikan tidak ada kesenjangan dalam peringkat, gunakan
DISTINCT
diGROUP_CONCAT
untuk membangun daftar skor yang berbeda:Hasil:
Ini juga berfungsi untuk mendapatkan peringkat pengguna tunggal:
Hasil:
sumber
COUNT
dan subquery sebagai gantinya. Lihat komentar saya di Jawaban DiterimaInilah jawaban terbaik:
Kueri ini akan kembali:
3
sumber
Solusi ini memberikan
DENSE_RANK
jika ada ikatan:sumber
Tidakkah pekerjaan berikut ini (dengan asumsi meja Anda disebut Skor)?
sumber
Saya punya ini, yang memberikan hasil yang sama dengan variabel. Ini bekerja dengan ikatan dan mungkin lebih cepat:
Saya tidak mengujinya, tapi saya menggunakan yang berfungsi sempurna, yang saya adaptasi dengan variabel yang Anda gunakan di sini.
sumber