Не ответ;слишком долго для комментария:
Я обычно пишу такие вещи точно так же, как вы, потому что это быстро и легко, но на самом деле есть технический недостаток этого метода - хотя это становится очевидным только внекоторые ситуации.
В качестве иллюстрации рассмотрим следующее:
DROP TABLE IF EXISTS ints;
CREATE TABLE ints (i INT NOT NULL PRIMARY KEY);
INSERT INTO ints VALUES
(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
Ваш запрос:
SELECT a.*
, @i:=@i+1 rank
FROM ints a
JOIN (SELECT @i:=0) vars
ORDER
BY RAND() DESC;
+---+------+
| i | rank |
+---+------+
| 3 | 4 |
| 2 | 3 |
| 5 | 6 |
| 1 | 2 |
| 7 | 8 |
| 9 | 10 |
| 4 | 5 |
| 6 | 7 |
| 8 | 9 |
| 0 | 1 |
+---+------+
Посмотрите, набор результатов не является "случайным"совсем.rank
всегда соответствует i
Теперь сравните это со следующим:
SELECT a.*
, @i:=@i+1 rank
FROM
( SELECT * FROM ints ORDER by RAND() DESC) a
JOIN (SELECT @i:=0) vars;
+---+------+
| i | rank |
+---+------+
| 5 | 1 |
| 2 | 2 |
| 8 | 3 |
| 7 | 4 |
| 4 | 5 |
| 6 | 6 |
| 0 | 7 |
| 1 | 8 |
| 3 | 9 |
| 9 | 10 |
+---+------+