UmbrellaCoders
@UmbrellaCoders
PHP, JS Developer

Как правильно сделать выборку в pl/pgsql функции postgresql?

И так, есть две таблицы следующего содержания

Таблица 1 (books)
|book_id|ctr|

Таблица 2 (book_stats)
|book_id|lang|category|ctr|

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

select book_id,  ctr from book_stats
 where lang = 'ru' and category = 'horror'
 order by ctr desc
 limit 200;


Но, в таблице 2 у меня только 20 записей например, под данный lang, categories.
А мне нужно вывести 200 записей, далее делаю так, остатки 180 записей беру в таблице 1
select book_id, ctr
         from books
         where book_id not in (
            select book_id  from book_stats
            where lang = 'ru' and category = 'horror'
            order by ctr desc
            limit 200;
         )
         order by ctr desc 
         limit 120


оба эти запроса объединяю union all, и вроде все работает.

Но как сделать так, что-бы во втором запросе limit был вычисляем в зависимости от результата первого запроса?

что бы если первый вернул N<200, второй брал 200-N результатов, а если в первом запросе есть 200 записей, то второй вообще не выполнять?

Вроде написал процедуру, но запутался в типах , кто подскажет как правильно реализовать, очень желательно в хранимой процедуре pl/pgsql.

Спасибо!
  • Вопрос задан
  • 999 просмотров
Решения вопроса 1
zoroda
@zoroda
Необычный Fullstack
Если правильно понял задачу, то нужно что-то в этом роде:
with book_stats_sum as (
select book_id, sum(ctr) ctr
from book_stats
where book_stats.lang = 'ru' and book_stats.category = 'horror'
group by book_id
) -- подстраховаться, чтобы выбиралось только по одной записи на каждый book_id
select books.book_id, coalesce(book_stats_sum.ctr, books.ctr) ctr
from books
left join book_stats_sum on book_stats_sum.book_id = books.book_id
order by coalesce(book_stats_sum.ctr, books.ctr) desc
limit 200
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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