В 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.