Выберите случайные строки в SQLite

38

В MySQL вы можете выбрать X случайных строк со следующим утверждением:

SELECT * FROM table ORDER BY RAND() LIMIT X

Это не работает, однако, в SQLite. Существует ли эквивалент?

Теги:

4 ответа

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

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

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

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

Таким образом, это уменьшает объем оперативной памяти и процессора, поскольку таблица растет!

  • 1
    Способ 2 был значительно быстрее, чем принятый ответ. Спасибо!
  • 0
    Это блестящее спасибо, я обновил принятый ответ :)
Показать ещё 4 комментария
52

SELECT * FROM table ORDER BY RANDOM() LIMIT X

  • 0
    Спасибо, это делает трюк
  • 4
    Для справки: это работает, но медленно на больших столах. Более быстрый способ (хотя и не совсем такой) будет: SELECT * FROM table WHERE random() % k = 0 LIMIT n; , Недостатком этого является то, что записи с более низкими первичными ключами получают более высокий шанс выбора. Взято отсюда
Показать ещё 1 комментарий
7
SELECT * FROM table ORDER BY RANDOM() LIMIT 1
0

Все ответы здесь основаны на ORDER BY. Это очень неэффективно (т.е. Неприменимо) для больших множеств. Почему бы не просто поместить abs(CAST(random() AS REAL))/9223372036854775808 < 0.5 в предложение WHERE, чтобы получить в этом случае шанс 0,5 ударов?

SELECT *
FROM table
WHERE abs(CAST(random() AS REAL))/9223372036854775808 < 0.5

Большое число - это максимальное абсолютное число, которое может выражать random(). abs() заключается в том, что он подписан. Результат - равномерно распределенная случайная величина между 0 и 1.

Ещё вопросы

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