Функция mysql Rand () приводит к неожиданным многорядным результатам - PullRequest
3 голосов
/ 03 апреля 2019

Когда я пытаюсь получить случайную строку из таблицы по идентификатору с помощью функции RAND(), я получаю неожиданные нестабильные результаты. Следующий запрос (где столбец id является первичным ключом) возвращает 1, 2 или более строк:

query and result

Я также попробовал следующий вариант, который дает тот же результат:

SELECT id, word FROM words WHERE id = FLOOR(RAND() * 1000)

Я нашел другое решение для моей задачи:

SELECT id, word FROM words ORDER BY RAND() LIMIT 1

Но я хочу знать, почему поведение MySQL столь неожиданно при использовании такой элементарной функциональности. Это пугает меня.

Я экспериментировал в разных IDE с одинаковыми результатами.

1 Ответ

3 голосов
/ 03 апреля 2019

Поведение не является неожиданным. Функция RAND() оценивается для каждой строки:

SELECT RAND() FROM sometable LIMIT 10

+----------------------+
| RAND()               |
+----------------------+
|   0.7383128467372738 |
|   0.6141578719151746 |
|   0.8558508500976961 |
|   0.4367806654766022 |
|   0.6163508078235674 |
|   0.7714120734216757 |
|   0.0080079743713214 |
|   0.7258036823252251 |
|   0.6049945192458057 |
|   0.8475615799869984 |
+----------------------+

Имея это в виду, этот запрос:

SELECT * FROM words WHERE id = FLOOR(RAND() * 1000)

означает, что каждая строка с идентификатором от 0 до 999 имеет 1/1000 вероятность быть ВЫБРАННОЙ!

...