Выберите случайные строки в SQLite
в MySQL, вы можете выбрать X случайных строк со следующим заявлением:
SELECT * FROM table ORDER BY RAND() LIMIT X
это, однако, не работает в SQLite. Есть ли эквивалент?
4 ответов
гораздо улучшенная производительность использование:
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
SQL-движки сначала загружают проецируемые поля строк в память, а затем сортируют их, здесь мы просто делаем случайную сортировку по полю id каждой строки, которая находится в памяти, потому что она индексируется, затем отделяем X из них и находим всю строку, используя эти X идентификаторы.
таким образом, это потребляет меньше ОЗУ и процессора по мере роста таблицы!
все ответы здесь основан на 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()
может произвести. The abs()
потому что оно подписано. Результатом является равномерно распределенная случайная величина между 0 и 1.
это имеет свои недостатки. Вы не можете гарантировать результат, и если порог большой по сравнению с таблицей, выбранные данные будут смещены в сторону начала таблицы. Но в некоторых тщательно продуманных ситуациях это может быть осуществимым вариантом.