В MySQL я могу использовать функцию RAND(), есть ли альтернатива в SQLite 3?
SQLite - ORDER BY RAND()
Ответ 1
используя random():
SELECT foo FROM bar
WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
LIMIT 1;
EDIT (по QOP):. Поскольку в документах SQLite Autoincrement в столбцах указано, что:
Стандартный алгоритм выбора ROWID, описанный выше, будет генерировать монотонно увеличивая уникальные ROWID, если вы никогда не используете максимальное значение ROWID, и вы никогда не удаляете запись в таблице с помощью самый большой ROWID. Если вы когда-либо удаляете строки, то ROWID из ранее удаленные строки могут быть повторно использованы при создании новых строк.
Вышеуказанное верно только в том случае, если у вас нет столбца INTEGER PRIMARY KEY AUTOINCREMENT
(он все равно будет работать с столбцами INTEGER PRIMARY KEY
). В любом случае, это должно быть более портативным/надежным:
SELECT foo FROM bar
WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar))
LIMIT 1;
ROWID
, _ROWID_
и OID
- все псевдонимы для внутреннего идентификатора строки SQLite.
Ответ 2
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
Ответ 3
Решено:
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
Ответ 4
Для более высокой производительности используйте это в SQLite:
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
Это также применимо к MySQL. Это работает быстрее, потому что SQL-модули сначала загружают проецируемые поля строк в память, а затем сортируют их, здесь мы просто загружаем и произвольно сортируем поле id строк, затем получаем X из них и находим целые строки из этих X-индексов, которые по умолчанию индексируются.