Объединение двух таблиц с чередованием результатов запросов на выборку обеих таблиц в пропорции - PullRequest
1 голос
/ 12 апреля 2020

У меня есть две таблицы

CREATE TABLE Posts
(
Id BIGSERIAL NOT NULL,
Content TEXT NOT NULL
);

CREATE TABLE Ads
(
Id BIGSERIAL NOT NULL,
Content TEXT NOT NULL
);

Мне нужно объединить эти две таблицы в пропорции и применить ORDER BY и OFFSET. 1 строка из таблицы Ads в каждой 10 строки из таблицы Posts Можно ли как-нибудь это сделать sh?

Финальные строки должны содержать 10 сообщений - 1 объявление - 10 постов - 1 объявление. Как можно добиться слияния двух таблиц с чередованием результатов разных селекторов

Обычный UNION объединит все строки без чередования

SELECT * FROM (SELECT Id, Content, 'Post' AS Type FROM Posts
UNION 
SELECT Id, Content, 'Ads' AS Type FROM Ads) AS sel
LIMIT 10;

1 Ответ

1 голос
/ 12 апреля 2020

Один из вариантов - использовать row_number():

select id, content, type
from (
    select id, content, 'post' type, (row_number() over(order by id) - 1) / 10 rn 
    from posts
    union all select id, content, 'ads', row_number() over(order by id) - 1 
    from ads
)
where rn <= 1
order by rn, type desc

Хитрость заключается в том, чтобы разделить номера строк таблицы posts на 10, чтобы каждая группа из 10 последовательных строк получила одинаковый ранг. Затем внешний запрос сортируется по рангу, а затем по убыванию. Сначала помещаются первые 10 сообщений (с рангом 0), затем 1 объявление и т. Д. Ранг также может быть использован для ограничения количества групп.

...