【问题标题】:PostgreSQL: Need to display "Ads" every N rowsPostgreSQL:需要每 N 行显示“广告”
【发布时间】:2015-10-26 14:10:33
【问题描述】:

鉴于,我有表格帖子和表格广告。 我有一个带有帖子的网页(无限滚动)。

我需要为 Posts 表中的每 N 行显示 Adverts 表中的行。

是否可以使用单个查询?

我想要达到的目标:

p01 p02 p03

p04 p05 p06

p07 a01 p08

p09 p10 p11

p12 p13 p14

a02 p15 p16

p17 p18 p19

p20 p21 a03

...

【问题讨论】:

  • Adverts 和 Posts 表是否具有相似的架构?如果没有,你主要是 SOL。我可能只使用两个查询。
  • @ColonelThirtyTwo 你可以认为他们使用相同的方案。
  • 行甚至可以在同一个表中。只是类型不同。我目前正处于计划阶段.. 考虑所有这一切的最佳组织

标签: postgresql web


【解决方案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;

每四个posts插入一个addv

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)    

【讨论】:

  • 效果很好!额外的问题.. 是否可以轮换/重复广告,例如如果我们在表格中只有一个广告,那么该广告每 4 行就会重复一次?
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多