Выбор случайных записей (SQL) - CodeHelper

Выбор случайных записей (SQL)

3

Как средствами SQL выбрать из таблицы заданное количество случайных (random) записей?

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

4

Похоже что в спецификациях SQL ничего нет про выборку случайных строк из таблицы. Тем не менее большинство движков баз данных поддерживает такую возможность, правда каждый по своему. Идея такая — используется сортировка не по полю, а по некоторому случайному числу, сгенерированному для каждой строки таблицы. Если взять первые n строк такой выборки, то они и будут содержать n случайных строк таблицы. Вот примеры SQL запросов:

MySql:

SELECT column FROM table
ORDER BY RAND()
LIMIT 1

PostgreSQL:

SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1

Microsoft SQL Server:

SELECT TOP 1 column FROM table
ORDER BY NEWID()

IBM DB2:

SELECT column, RAND() as IDX 
FROM table 
ORDER BY IDX FETCH FIRST 1 ROWS ONLY

Oracle:

SELECT column FROM
( SELECT column FROM table
ORDER BY dbms_random.value )
WHERE rownum = 1

Примеры взяты из статьи SQL to Select a random row from a database table. Во всех примерах выбирается одна случайная запись, но запросы легко обобщить на случай n записей.

galayko

Эти примеры проблему решают, но создают новую. Эта проблема - неэффективность. К сожалению, общей методики борьбы нет. Например, я заранее в скрипте вычислял случайное смещение и после этого делал выборку.

$offset = rand(0, <Тут максимум, зависящий от данных>);
$res = mysql_query("select ... from table order by ... limit $offset,1");

Сразу скажу: этот метод не для всех данных подходит, надо смотреть по задаче.

v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.