提问人:Farshan 提问时间:4/13/2020 最后编辑:GMBFarshan 更新时间:4/13/2020 访问量:256
合并两个表,按比例交错两个表的选择查询结果
Merging two tables with interleaving the result of select queries of both tables in a proportion
问:
我有两张桌子
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
最后一行应为 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;
答:
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')
评论