鑑於,我有表格帖子和有表廣告。 我有一個網頁的帖子(無限滾動)。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你可以認爲他們是因爲他們使用相同的方案。 –
行甚至可以在同一張表中。只是不同的類型。我目前正在策劃舞臺..想到這一切的最佳組織 –