LIMIT, затем RAND, а не RAND, затем LIMIT

Я использую полнотекстовый поиск для извлечения строк.
Я упорядочиваю строки на основе оценки (ORDER BY SCORE), затем из первых 20 строк (LIMIT 20) я хочу ранжировать (RAND) результирующий набор.

Итак, для любого конкретного поискового запроса я хочу случайным образом показать 5 из 20 лучших результатов.

Мой обходной путь основан на коде: я помещаю 20 лучших в массив, а затем случайным образом выбираю 5.

Есть ли способ sql сделать это?


person Larry    schedule 15.04.2010    source источник


Ответы (1)


Вы можете сделать это, используя внутренний выбор. Выберите первые двадцать строк во внутреннем выборе. Во внешнем выборе эти строки упорядочиваются случайным образом и выбираются пять лучших:

SELECT *
FROM (
    SELECT *
    FROM table1
    ORDER BY score DESC
    LIMIT 20
) AS T1
ORDER BY RAND()
LIMIT 5
person Mark Byers    schedule 15.04.2010
comment
Оценивает ли RAND по-разному для каждой строки в MySQL? (Я спрашиваю, потому что в SQL Server вам придется использовать NEWID) - person gbn; 15.04.2010
comment
+1 Другой обходной путь - двойной вложенный запрос (@gbn: да, это так) - person Andomar; 15.04.2010
comment
@gbn: ORDER BY RAND() combined with LIMIT is useful for selecting a random sample from a set of rows из dev.mysql.com/doc /refman/5.0/ru/ - person Mark Byers; 15.04.2010
comment
Заказ только 20 строк без ключа, вероятно, не будет заметен для пользователя, плюс вы не отправляете неиспользуемые строки клиенту. - person Marcus Adams; 15.04.2010
comment
Если есть 21 человек с одинаковым высоким баллом, возможно, 21-й человек никогда не будет отображаться. Удаление внутреннего LIMIT было бы более справедливым, но это будет стоить вам производительности. Просто кое что для раздумий. Вы можете сказать им, что для гарантированного места на стене им нужно превзойти рекорд. - person Marcus Adams; 16.04.2010