Понадобилось написать 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.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть класс Person и две таблички в базе данных
Можно ли вынести view за пределы экрана? Как бы это реализовать, желательно, в xml, в коде java тоже сойдетВ общем, мне нужно конец вьюшки (красная...
Как изменить цвет текста у виджета EditText, в состоянии enabled(false)?
Имеются несколько объектов, которые нужно объединить в HashSet коллекцию и сохранить в XML файле и в дальнейшем их от туда извлечь