我们有一个使用rails,react和postgresql的CMS。我们的表格中存储了页面和部分。 每个页面由一组片段组成(一个数组字段)。
我们有多个页面可以使用。
我们说我们正在渲染page_id 50806
。我们的反应前端需要采用以下格式的数据。
pieces: [
{id: B1fu5jthb, included_on_pages: [50808, 50806]},
{id: BJTNssF2Z, included_on_pages: [50808]}
]
目前,为了找到included_on_pages
,我正在编写一个查询来获取页面的所有部分,然后循环遍历每个部分以查找包含特定部分的页面。
(基本上是N + 1次查询。)
select pieces from page_pieces where page_id = 50806
Looping over each piece
select page_id from page_pieces where 'B1fu5jthb' = any(page_pieces.pieces);
所以我的问题,
我们可以编写一个join statements
来获取所有部分及其included_on_pages
答案 0 :(得分:0)
我认为,取消,ANY
比较和数组聚合的组合应该有效:
with
pcs as (select unnest(pieces) as id from page_pieces where page_id = 50806)
select id, array_agg(page_id) as included_on_pages
from pcs inner join page_pieces on id = any(pieces)
group by id;