with SQLite-ORDER BY RAND()




use count in where sql (4)

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


Решено:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;

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

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

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


используя random() :

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

EDIT (по QOP): поскольку в документах по столбцам SQLite Autoincrement ed указано, что:

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


SELECT * FROM table ORDER BY RANDOM() LIMIT 1;




random-access