合并两个表,按比例交错两个表的选择查询结果

Merging two tables with interleaving the result of select queries of both tables in a proportion

提问人:Farshan 提问时间:4/13/2020 最后编辑:GMBFarshan 更新时间:4/13/2020 访问量:256

问:

我有两张桌子

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

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

我需要将这两个表按比例组合并应用 和 . 表中的行 表中的每一行 有什么方法可以做到这一点吗?ORDER BYOFFSET1Ads10Posts

最后一行应为 10 个帖子 - 1 个广告 - 10 个帖子 - 1 个广告。如何实现将不同选择的结果交错的两个表合并

Normal 将合并所有行而不交错UNION

SELECT * FROM (SELECT Id, Content, 'Post' AS Type FROM Posts
UNION 
SELECT Id, Content, 'Ads' AS Type FROM Ads) AS sel
LIMIT 10;
postgresql sql-order-by 联合

评论


答:

2赞 GMB 4/13/2020 #1

一种选择是使用: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

诀窍是将表的行号除以 10 - 因此每组连续 10 行获得相同的排名。然后,外部查询按等级排序,然后按降序类型排序。这会将前 10 个帖子放在第一位(排名为 0),然后是 1 个广告,依此类推。排名还可用于限制组的数量。posts

评论

0赞 Farshan 4/13/2020
条件的目的是什么?因为在这种情况下,查询最多只返回 20 行。rn <= 1
0赞 GMB 4/13/2020
@Farshan:我知道你只想要两个组(10个帖子,1个广告,10个帖子,1个广告)。如果您想要所有组,则只需删除该条件即可。
0赞 Farshan 4/13/2020
对不起,误导了你。你的回答对我有用。谢谢你:)
0赞 Farshan 4/13/2020
只是一个查询,如果帖子表中没有更多要合并的记录,并且我不希望剩余的广告作为列表的最后一行,该怎么办?
0赞 Farshan 4/13/2020
为了回答我的上述查询,我只是在 cte 中使用了上面的查询并添加了条件。rn <= (select max(rn) from cte where type = 'post')