#mysql #sql #random #mysql-5.6
#mysql #sql #Случайный #mysql-5.6
Вопрос:
Когда я пытаюсь получить случайную строку из таблицы по идентификатору с помощью RAND()
функции, я получаю неожиданные нестабильные результаты. Следующий запрос (где столбец id является первичным ключом) возвращает 1, 2 или даже больше строк:
Я также попробовал следующий вариант, который дает тот же результат:
SELECT id, word FROM words WHERE id = FLOOR(RAND() * 1000)
Я нашел другое решение для своей задачи:
SELECT id, word FROM words ORDER BY RAND() LIMIT 1
Но я хочу знать, почему поведение MySQL настолько неожиданно при использовании такой элементарной функциональности. Это меня пугает.
Я экспериментировал в разных IDE с одинаковыми результатами.
Комментарии:
1. Просто добавьте
LIMIT
к вашему исходному SQL2. вы также можете найти этот способ полезным.
Ответ №1:
Поведение не является неожиданным. 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!
Комментарии:
1. Можете ли вы объяснить, как вероятность для каждой строки влияет на результат ВЫБОРА. Можно ли ожидать результат без строк, а также 1 строк?
2. @Martin Я подчеркнул слово every . ожидаются 0 строк и 1 . Я не тестировал, но теоретически, если вы выполните приведенный выше запрос 1000 раз и запишите все идентификаторы, вы заметите, что каждая строка выбирается примерно 1 раз.