2017-10-10 2 views
1

우리는 레일스, 반응 및 포스트그레스를 사용하는 CMS를 가지고 있습니다. 우리는 테이블에 저장된 페이지와 조각을 가지고 있습니다. 각 페이지는 조각 세트 (배열 필드)로 구성됩니다.포스트 그레스 배열 필드가있는 내부 조인

여러 페이지에 걸쳐 사용할 수있는 조각이 있습니다.

enter image description here

의 우리가 페이지 ID 50806 렌더링되어 있다고 가정 해 봅시다. 우리의 프런트 엔드는 다음 형식의 데이터가 필요합니다. included_on_pages을 찾을 그래서 현재

pieces: [ 
{id: B1fu5jthb, included_on_pages: [50808, 50806]}, 
{id: BJTNssF2Z, included_on_pages: [50808]} 
] 

는, 나는 페이지의 모든 조각을 가져 오기 위해 하나 개의 쿼리를 작성하고 특정 부분이 포함되어있는 페이지를 찾기 위해 각 부분에 걸쳐 반복하고 있습니다.

(기본적으로 N + 1 쿼리.) 그래서 제 질문, 대신의 각 부분에 걸쳐 반복하고이 포함 된 페이지를 찾을 수

Looping over each piece

select page_id from page_pieces where 'B1fu5jthb' = any(page_pieces.pieces);

select pieces from page_pieces where page_id = 50806 , 모든 조각을 가져 오려면 join statements 한 개를 쓸 수 있고 그 수는일 수 있습니까?

답변

0

나는 unnesting의 조합, 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; 

See it on SQL Fiddle