Выберите случайные строки в SQLite

В MySQL вы можете выбрать X случайных строк со следующим утверждением:

SELECT * FROM table ORDER BY RAND() LIMIT X

Это не работает, однако, в SQLite. Существует ли эквивалент?

Ответ 1

Для большей лучшей производительности используйте:

SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)

Двигатели SQL сначала загружают проецируемые поля строк в память, а затем сортируют их, здесь мы просто делаем случайный сортировку по полю id каждой строки, которая находится в памяти, потому что она проиндексирована, а затем отделяет X от них, и найдите всю строку, используя эти X-идентификаторы.

Таким образом, это уменьшает объем оперативной памяти и процессора, поскольку таблица растет!

Ответ 2

SELECT * FROM table ORDER BY RANDOM() LIMIT X

Ответ 3

SELECT * FROM table ORDER BY RANDOM() LIMIT 1

Ответ 4

Все ответы здесь основаны на 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.