SQLite - ЗАКАЗАТЬ ПО RAND () - PullRequest
       16

SQLite - ЗАКАЗАТЬ ПО RAND ()

63 голосов
/ 10 августа 2009

В MySQL я могу использовать функцию RAND (), есть ли альтернатива в SQLite 3?

Ответы [ 4 ]

125 голосов
/ 10 августа 2009
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
49 голосов
/ 10 августа 2009

с использованием random () :

SELECT foo FROM bar
  WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
  LIMIT 1;

РЕДАКТИРОВАТЬ (по QOP): Поскольку в документах по Автоинкремент SQLite ed столбцы указано, что:

Обычный алгоритм выбора 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.

35 голосов
/ 10 августа 2009

Решено:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
13 голосов
/ 06 июля 2014

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

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

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

...