функция mysql Rand () вызывает неожиданные результаты многорядности

#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 к вашему исходному SQL

2. вы также можете найти этот способ полезным.

Ответ №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 раз.