2015-10-26 31 views
0

鉴于,我有表格帖子和有表广告。 我有一个网页的帖子(无限滚动)。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

...

+0

做广告和张贴表具有相似的模式?如果不是,你主要是SOL。我可能只是使用两个查询。 –

+0

@ColonelThirtyTwo你可以认为他们是因为他们使用相同的方案。 –

+0

行甚至可以在同一张表中。只是不同的类型。我目前正在策划舞台..想到这一切的最佳组织 –

回答

1

示例表:

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 joingenerate_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)  
+0

作品非常棒!奖金的问题..是否有可能旋转/重复广告,就像我们在表格中只有一个广告一样,那么这个广告每4行重复一次? –

+0

@VitalyDyatlov - 是的,请参阅编辑答案。 – klin