Bugün, bir müşteri projesi üzerinde çalışırken şu görevle karşılaştım: "id" ve "puan" sütunlarına sahip bir SQL tablosu "kullanıcı" alın ve tüm kullanıcıların hangi "puana" göre sıralandığını belirleyin aynı puanla aynı sıralamayı alır. Bu görev, kullanıcı tanımlı değişkenler kullanılarak sezgisel ve kolay bir şekilde çözülebilir.
CREATE TABLE user(id INT, score INT); INSERT INTO user(id, score) VALUES (1, 10), (2, 40), (3, 55), (4, 10), (5, 5), (6, 20), (7, 30), (8, 70), (9, 30)
İki değişken kullanmak bunu basitçe çözer
SET @score_prev = NULL; SET @cur_rank = 0; SELECT id, score, CASE WHEN @score_prev = score THEN @cur_rank WHEN @score_prev := score THEN @cur_rank := @cur_rank + 1 END AS rank FROM user ORDER BY score DESC
ve istediğiniz çıktıyı elde edersiniz
+--------+-----------+----------+ | *id* | *score* | *rank* | | 8 | 70 | 1 | | 3 | 55 | 2 | | 2 | 40 | 3 | | 7 | 30 | 4 | | 9 | 30 | 4 | | 6 | 20 | 5 | | 1 | 10 | 6 | | 4 | 10 | 6 | | 5 | 5 | 7 | +--------+-----------+----------+