Понадобилось написать SQL запрос на выбор случайной записи, не долго думая открыл документацию MySQL, почитал про рандом и получилось вот это
SELECT * FROM `Task` WHERE id = (FLOOR(1 + RAND() * (SELECT Count(`id`) FROM `Task`)))
В первый раз все ок(Повезло), потом 3 записи, потом 0, ну и так далее... Почему?
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.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей