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

55

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

Теги:
database
random-access

4 ответа

43
Лучший ответ

используя 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
    +1, это намного быстрее, чем другие опции, при условии, что id является индексом.
  • 14
    Да, это решение быстрее, но предполагает, что id начинается с 1 и не имеет пробелов. В противном случае строки, следующие за пробелами, «выбираются случайным образом» чаще, чем другие строки.
Показать ещё 6 комментариев
108
SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
  • 3
    И для записи ограничение не должно быть 1, если вы хотите упорядочить всю таблицу случайным образом и получить доступ ко всем строкам в этом случайном порядке.
  • 1
    Это также будет работать, если у вас есть сложное предложение WHERE и вы хотите случайную строку из этого отфильтрованного списка. Принятый ответ не поддерживает это легко.
Показать ещё 2 комментария
31

Решено:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;
  • 8
    Я не согласен. Теперь у нас есть две части информации: как выбрать одну запись случайным образом, как вывести список всех записей случайным образом. Мне никогда не нужно было делать это, но если я это сделаю, то теперь я знаю как. Я также знаю, что MySQL отличается от SQLlite. Супер технический вопрос был бы более впечатляющим, но менее полезным.
  • 0
    Моей первой мыслью было, что не было никакой функции, чтобы упорядочивать результаты случайным образом, или если бы была такая функция / функция, она была бы значительно более непонятной - это то, что происходит, например, с триггерами SQLite.
Показать ещё 1 комментарий
9

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню