Выберите случайные строки в SQLite - PullRequest
51 голосов
/ 06 ноября 2010

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

SELECT * FROM table ORDER BY RAND() LIMIT X

Однако в SQLite это не работает.Есть ли эквивалент?

Ответы [ 5 ]

66 голосов
/ 06 июля 2014

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

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

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

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

58 голосов
/ 06 ноября 2010

SELECT * FROM table ORDER BY RANDOM() LIMIT X

8 голосов
/ 06 ноября 2010
SELECT * FROM table ORDER BY RANDOM() LIMIT 1
2 голосов
/ 16 ноября 2017

Все ответы здесь основаны на ORDER BY.Это очень неэффективно (т.е. непригодно для использования) для больших наборов, потому что вы будете оценивать RANDOM() для каждой записи, а затем 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.

Это имеет свои недостатки.Вы не можете гарантировать результат, и если пороговое значение велико по сравнению с таблицей, выбранные данные будут смещены к началу таблицы.Но в некоторых тщательно продуманных ситуациях это может быть осуществимым вариантом.

0 голосов
/ 15 марта 2019

Это решает отрицательные случайные целые числа и сохраняет хорошую производительность на больших наборах данных:

SELECT * FROM table LIMIT 1 OFFSET abs(random() % (select count(*) from table));

где:
abs(random() % n ) Дает вам положительное целое число в range(0,n)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...