2015-10-26 62 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