鉴于,我有表格帖子和有表广告。 我有一个网页的帖子(无限滚动)。PostgreSQL:需要显示“广告”每N行
我需要从Posts表中的每N行显示广告表中的行。
是否可以使用单个查询?
我想达到的目标:
P01 P02 P03
P04 P05 P06
P07 A01 P08
P09 P10 P11
P12 P13 P14
A02 P15 P16
P17 P18 P19
P20 P21 A03
...
鉴于,我有表格帖子和有表广告。 我有一个网页的帖子(无限滚动)。PostgreSQL:需要显示“广告”每N行
我需要从Posts表中的每N行显示广告表中的行。
是否可以使用单个查询?
我想达到的目标:
P01 P02 P03
P04 P05 P06
P07 A01 P08
P09 P10 P11
P12 P13 P14
A02 P15 P16
P17 P18 P19
P20 P21 A03
...
示例表:
create table posts (post_id int, post text);
insert into posts select i, 'p_'||i from generate_series(1, 13) i;
create table adds (addv_id int, addv text);
insert into adds select i, 'a_'||i from generate_series(1, 3) i;
插入一个addv
每四个posts
:
select post,
row_number() over (order by post_id)
+ (row_number() over (order by post_id)- 1)/ 4 rank
from posts
union
select addv, row_number() over (order by addv_id)* 5
from adds
order by 2;
post | rank
------+------
p_1 | 1
p_2 | 2
p_3 | 3
p_4 | 4
a_1 | 5
p_5 | 6
p_6 | 7
p_7 | 8
p_8 | 9
a_2 | 10
p_9 | 11
p_10 | 12
p_11 | 13
p_12 | 14
a_3 | 15
p_13 | 16
(16 rows)
您可以使用cross join
与generate_series()
到旋转adds
。您应该使用两个序号列来完成此操作。但是,如果你可以假设addv_id
小于10000,为简单起见使用一列:
select addv_id+ i* 10000 addv_id, addv
from adds
cross join generate_series(1, 3) i -- 3 number of repeats
order by 1;
addv_id | addv
---------+------
10001 | a_1
10002 | a_2
10003 | a_3
20001 | a_1
20002 | a_2
20003 | a_3
30001 | a_1
30002 | a_2
30003 | a_3
(9 rows)
作品非常棒!奖金的问题..是否有可能旋转/重复广告,就像我们在表格中只有一个广告一样,那么这个广告每4行重复一次? –
@VitalyDyatlov - 是的,请参阅编辑答案。 – klin
做广告和张贴表具有相似的模式?如果不是,你主要是SOL。我可能只是使用两个查询。 –
@ColonelThirtyTwo你可以认为他们是因为他们使用相同的方案。 –
行甚至可以在同一张表中。只是不同的类型。我目前正在策划舞台..想到这一切的最佳组织 –