Случайная сортировка

Mysql позволяет сортировать случайным образом

SELECT * FROM my_table ORDER BY RAND()

Проблема в том, что такая сортировка зачастую вовсе не нужна для всей выборки - хочется просто достать случайный элемент из определённого множества, к тому же ORDER BY RAND() достаточно медленный выход из ситуации.

Можно попробовать делать выборку основываясь на числе элементов в целом и функции RAND():SELECT name FROM my_table JOIN (
SELECT CEIL(RAND() * (
SELECT MAX(id) FROM my_table
)) AS randomID
) AS random_table ON random_table.randomID=my_table.ID

На 50000 рядов такой запрос занимает 0.00086 сек.. Сравните с 1.56356 сек обычного варианта ORDER BY RAND().

Недавно натолкнулся на один интересный вариант:

select G.*, rand() as RO from GOODS G order by RO

Вероятно вас заинтересует случайная сортировка в Postgre, где рассматриваются и другие способы. 

RSS

Комментарии

  • Galchenkov
    avatar
    А теперь представьте, что у вас в таблице 10 (100) записей и надо выбрать уникальных 5 (50).

    Мне кажется, в вашем случае, я могу получить дубликаты. Либо придётся сильно усложнить запрос.
  • Для маленьких таблиц безусловно ORDER BY RAND() нужен. И выше преведён только для одного ряда запрос. Там много может быть проблем. Если последовательность ID'шников с дырками, то можно вообще ряд не получить.
  • Сергей
    avatar
    мне кажется так было бы попроще

    SELECT name FROM my_table WHERE id = CEIL(RAND() * (SELECT MAX(id) FROM my_table))
  • Да, у вас получше будет
  • Сергей
    avatar
    еще хотел сказать, что если id имеет прерывания (например id=1,3, 45, 3423), то выборка работать не будет. Т.е выбиратся max id=3423, потом CEIL(RAND()) и получаем например id = 765, которого физически нет в таблице...
  • Да, я это в статье про Postgre писал - см. выше ссылку