В MySQL вы можете выбрать X случайных строк со следующим утверждением:
SELECT * FROM table ORDER BY RAND() LIMIT X
Это не работает, однако, в SQLite. Существует ли эквивалент?
Для большей лучшей производительности используйте:
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
Двигатели SQL сначала загружают проецируемые поля строк в память, а затем сортируют их, здесь мы просто делаем случайный сортировку по полю id каждой строки, которая находится в памяти, потому что она проиндексирована, а затем отделяет X от них, и найдите всю строку, используя эти X-идентификаторы.
Таким образом, это уменьшает объем оперативной памяти и процессора, поскольку таблица растет!
SELECT * FROM table ORDER BY RANDOM() LIMIT X
SELECT * FROM table WHERE random() % k = 0 LIMIT n;
, Недостатком этого является то, что записи с более низкими первичными ключами получают более высокий шанс выбора. Взято отсюда
SELECT * FROM table ORDER BY RANDOM() LIMIT 1
Все ответы здесь основаны на ORDER BY
. Это очень неэффективно (т.е. Неприменимо) для больших множеств. Почему бы не просто поместить abs(CAST(random() AS REAL))/9223372036854775808 < 0.5
в предложение WHERE
, чтобы получить в этом случае шанс 0,5 ударов?
SELECT *
FROM table
WHERE abs(CAST(random() AS REAL))/9223372036854775808 < 0.5
Большое число - это максимальное абсолютное число, которое может выражать random()
. abs()
заключается в том, что он подписан. Результат - равномерно распределенная случайная величина между 0 и 1.