Как сформировать рандомную выборку товаров с присутствием минимум 1 товара определенной группы?

Доброго времени суток.

Есть таблица с товарами. Необходимо выбрать из неё 4 товара рандомом, но из 4-ех - как минимум 1 должен быть из определенной группы товаров (с благотворительностью).

Как в данном случае составить запрос оптимально?

Из того что приходит в голову:

- запрос 3-ех рандомом с последующим запросом одного (или более, в зависимости от кол-ва результатов предыдущего запроса) рандома из нужной категории // 2 запроса вместо одного
- пляски с union // сложная логика запроса
- хранимые процедуры // чего очень не хочется

Есть ли что либо более эффективное?
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
Trixon
@Trixon
Суровый ASP.NET веб-разработчик
Держите:

SELECT *
FROM public.bazaar_items
WHERE charity IS TRUE
UNION
SELECT *
FROM public.bazaar_items
OFFSET (random()*B) LIMIT R;

Где B -- константа, целое число, 1 <= B <= MAX - R.

Однако я бы на Вашем месте не стал лишний раз задействовать вычислительные ресурсы сервера СУБД вызывая на нём random(), а отдал бы это на растерзание бэкенду, переписав последнюю строчку запроса как:

OFFSET (F) LIMIT R;

Где F -- целое число, генерирующееся в диапазоне 1 <= F <= MAX - R на бэкенде.

MAX -- максимальное количество товаров.
R -- максимальное количество выводимых товаров (в Вашем случае 4).

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

Войдите, чтобы написать ответ

Похожие вопросы