Как работает данный запрос? SQL

356
25 февраля 2017, 04:52

Понадобилось написать SQL запрос на выбор случайной записи, не долго думая открыл документацию MySQL, почитал про рандом и получилось вот это

SELECT * FROM `Task` WHERE id = (FLOOR(1 + RAND() * (SELECT Count(`id`) FROM `Task`)))

В первый раз все ок(Повезло), потом 3 записи, потом 0, ну и так далее... Почему?

Answer 1

MySQL ради каждой записи заново вычисляет значение случайного числа. посмотрим что происходит:

SELECT id, (FLOOR(1 + RAND() * ((SELECT Count(id) FROM Test)))) rnd
  FROM Test

результат:

'1', '4'
'2', '12'
'3', '10'
'4', '12'
'5', '8'
'6', '1'
'7', '5'
'8', '10'
'9', '9'
'10', '11'
'11', '9'
'12', '12'

А теперь накладываем на это наш фильтр id=rnd, на выходе строки:

'9', '9'
'12', '12'

Итого 2 записи. Просто так сложилось, что на момент выбора этих id из БД rand() дала точно такое же значение и условие сработало. Если нам не повезет rand() может ни для одной строки не дать совпадающего значения.

Так будет надежно:

SELECT id
  FROM Test, (select (FLOOR(1 + RAND() * ((SELECT Count(id) FROM Test)))) rnd) X
 WHERE id=rnd

В данном случае MySQL сначала вычислит (один раз) rand(), а потом будет искать запись с нужным id.

READ ALSO
Добавление записи в базу данных со списком параметров JAVA

Добавление записи в базу данных со списком параметров JAVA

У меня есть класс Person и две таблички в базе данных

360
Вынести view за пределы экрана

Вынести view за пределы экрана

Можно ли вынести view за пределы экрана? Как бы это реализовать, желательно, в xml, в коде java тоже сойдетВ общем, мне нужно конец вьюшки (красная...

255
Стиль EditText (заблокированного)

Стиль EditText (заблокированного)

Как изменить цвет текста у виджета EditText, в состоянии enabled(false)?

332
Не удаётся сохранить HashSet коллекцию объектов в XML файл (java)

Не удаётся сохранить HashSet коллекцию объектов в XML файл (java)

Имеются несколько объектов, которые нужно объединить в HashSet коллекцию и сохранить в XML файле и в дальнейшем их от туда извлечь

256