SQLite-порядок по RAND()


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

4 60

4 ответа:

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

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

EDIT (by QOP): так как документы на SQLite AutoincrementEd columns утверждает, что:

обычный алгоритм выбора ROWID, описанный выше будет генерировать монотонно увеличивая уникальные ROWIDs пока вы никогда не используете максимальное значение ROWID, и вы никогда не удаляете запись в таблице с помощью самый большой ROWID. если вы когда-нибудь удалить строки, затем ROWIDs из ранее удаленные строки могут быть использованы при создании новых строк.

вышесказанное верно только в том случае, если у вас нет 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;

решила:

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 ID, которые по умолчанию индексируются.