Inilah solusi alternatif:jangan simpan peringkat sama sekali! :-)
Anda dapat menghitungnya dengan cepat.
Contoh:
SELECT id, (@next_rank := IF(@score <> score, 1, 0)) nr,
(@score := score) score, (@r := IF(@next_rank = 1, @r + 1, @r)) rank
FROM rank, (SELECT @r := 0) dummy1
ORDER BY score DESC;
Hasil:
+------+----+-------+------+
| id | nr | score | rank |
+------+----+-------+------+
| 2 | 1 | 23 | 1 |
| 4 | 1 | 17 | 2 |
| 1 | 0 | 17 | 2 |
| 5 | 1 | 10 | 3 |
| 3 | 1 | 2 | 4 |
+------+----+-------+------+
nr
di sini adalah kolom tambahan yang menunjukkan apakah kita harus menetapkan peringkat berikutnya atau tidak.
Anda dapat membungkus kueri ini dengan select
lainnya dan melakukan paging, misalnya.
SELECT id, score, rank
FROM (SELECT id, (@next_rank := IF(@score <> score, 1, 0)) nr,
(@score := score) score, (@r := IF(@next_rank = 1, @r + 1, @r)) rank
FROM rank, (SELECT @r := 0) dummy1
ORDER BY score DESC) t
WHERE rank > 1 and rank < 3;
Hasil:
+------+-------+------+
| id | score | rank |
+------+-------+------+
| 4 | 17 | 2 |
| 1 | 17 | 2 |
+------+-------+------+
PERHATIAN :sejak sekarang rank
adalah kolom yang dihitung, Anda tidak dapat mengindeksnya dan secara efisien membuka halaman jauh ke dalam kumpulan data (yaitu, "pilih catatan dengan peringkat dari 3000 hingga 3010"). Tapi itu masih bagus untuk "pilih peringkat N teratas" (asalkan Anda memasukkan LIMIT
yang sesuai pada kueri)