[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Умный RAND() в MySQL
VoLk88
Например, мне нужно вывести 10 каких-либо топиков случайным образом, я делаю так:
SQL
SELECT * FROM `topics` ORDER BY RAND() LIMIT 10;

А как бы сделать так, чтобы ни одной записи из прошлой сортировки в новый раз не отображалось?



Спустя 1 час, 21 минута, 15 секунд (20.09.2009 - 15:37) sergeiss написал(а):
Вариант есть, и очень простой.

1. При первом вызове запомни все айдишники (или другие уникальные параметры, однозначно идентифицирующие строки).
2. При формировании второго запроса добавь условие (я взял абстрактный набор айдишников, предполагая, что они и были выбраны предыдущий раз):
SQL
SELECT * FROM `topics` WHERE ID <> 10 and ID <> 27 and ID <> 38 and ID <> 498 and ID <> 875 and ID <> 1025 and ID <> 4568 and ID <>7432 and ID <> 10987 and ID <> 12548
ORDER BY RAND() LIMIT 10;


Спустя 12 минут, 13 секунд (20.09.2009 - 15:49) Guest написал(а):
нуу тогда уже
SQL
WHERE `id` NOT IN (IDшники через запятую)

как то красивше

Спустя 4 минуты, 44 секунды (20.09.2009 - 15:54) sergeiss написал(а):
Цитата (Guest @ 20.09.2009 - 16:49)
нуу тогда уже
SQL
WHERE `id` NOT IN (IDшники через запятую)

как то красивше

Оно "красивше" smile.gif, это да, но на больших таблицах скорость выполнения может быть достаточно большой - этот вопрос уже многократно рассматривался тут.

Спустя 1 час, 29 минут, 19 секунд (20.09.2009 - 17:23) waldicom написал(а):
Цитата (sergeiss @ 20.09.2009 - 14:54)
Цитата (Guest @ 20.09.2009 - 16:49)
нуу тогда уже
SQL
WHERE `id` NOT IN (IDшники через запятую)

как то красивше

Оно "красивше" smile.gif, это да, но на больших таблицах скорость выполнения может быть достаточно большой - этот вопрос уже многократно рассматривался тут.

Т.е. утверждается, что IN всегда дольше, чем ID <> 10 and ...........
?

Спустя 32 минуты, 20 секунд (20.09.2009 - 17:55) glock18 написал(а):
Цитата
Т.е. утверждается, что IN всегда дольше, чем ID <> 10 and ...........
?


я тоже задался таким вопросом. мне видится верным обратное.

Спустя 1 час, 18 минут, 1 секунда (20.09.2009 - 19:13) Nikitian написал(а):
Не помню где читал: mysql оптимизирует and лучше, чем or. In - это обёртка для "or" Т.е. вы пишете примерно так: WHERE not (id=1 or id=2 or id=3....) Что не есть гуд.

Спустя 3 часа, 23 минуты, 50 секунд (20.09.2009 - 22:37) sergeiss написал(а):
Цитата (waldicom @ 20.09.2009 - 18:23)
Т.е. утверждается, что IN всегда дольше, чем ID <> 10 and ...........

Это не я утверждаю, это кто-то мне доказывал тут на форуме несколько месяцев тому назад smile.gif Только я не помню, кто именно. Вспомню - скажу. И дам ссылки на это обсуждение.
Я тоже предпочитал использовать IN (), потому как оно удобнее.

Спустя 8 часов, 30 минут, 19 секунд (21.09.2009 - 07:07) kirik написал(а):
Если не критична рандомность выборки, то просто кэшируй например 100 id-шников (даже можно выбирать тем же ORDER BY RAND) на 5-10 минут, потом применяешь shuffle() к этому массиву и делаешь срез (array_slice()) с указанием нужного количества элементов.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.