SQLite-порядок по RAND()
в MySQL я могу использовать функцию RAND (), есть ли альтернатива в SQLite 3?
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.
для гораздо лучшей производительности используйте это в SQLite:
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)
Это также применимо к MySQL. Это работает быстрее, потому что SQL-движки сначала загружают проецируемые поля строк в память, а затем сортируют их, здесь мы просто загружаем и случайным образом сортируем поле id строк, затем получаем X из них и находим целые строки этих X ID, которые по умолчанию индексируются.