@andrey_27081

Какая логика поднятия объявлений в топ?

Имеется доска объявлений о продаже недвижимости. Имеется функция за определенную плату вывести объявление в топ на 3 дня.
По сути своей логика простая, но если этих премиум объявлений 1 000 из 100 000, не выводить же сначала все премиум (оплаченные) а потом обычные, тогда для не премиум объявлений просто не будет выбора, они будут где-то на сотых страницах если не дальше.
Как выстроить логику выборки объявлений, чтобы выводились несколько премиум (пусть 5), а потом обычные объявлений, чтобы премиум постоянно менялись, ну думаю это логично.
  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Я бы построил бы структуру таблиц так, чтобы можно было бы выполнить такой запрос (по версии sql Oracle):
-- премиум выборка
select  1 as priv_type, -- тип привилегии 1 - премиум объявление
    C.*
from
(
  select B.*,
             dense_runk() over (order by B.user_id) as user_num, -- нумеруем авторов объявлений
             row_number() over (partition by B.user_id order by rownum) as add_num -- нумеруем объявление в пределах автора
  from
  ( -- достаем премиум объявления в случайной сортировке
     select A.*
       from A
     where premium_pay_date is not null and sysdate - premium_pay_date <= 3 -- условие попадания в премиум
  order by DBMS_RANDOM.RANDOM
   ) B
) C
where user_num <= 5 -- берем 5 авторов
   and add_num = 1  -- по одному объявлению от автора
union
-- обычная выборка
select 2 as priv_type, -- тип привилегии 2 - обычное объявление
         A.*,
        -- зануляем доп. поля от премиум, чтобы union работал корректно
        null user_num,
        null add_num 
  from A
  where premium_pay_date is null or sysdate - premium_pay_date > 3 -- можно исключить премиум из общей выборки, а можно не исключать
order by priv_type, Publication_Date desc
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы