2016-09-29 3 views
0

나는 두 개의 테이블이 있습니다 및 내가 필터 ID의 한 목록에있는 모든 필터와 일치하는 상품을 찾을 필요가 goodid에서 FilterId 열과 함께 filter_good : 필터 열 ID 그리고 하나 열 ID와 제목 제품 테이블 크로스를 조인 또 다른 필터 ID 목록의 모든 필터와 일치시킵니다. 이Postgresql에서 mulltiple IN 절을 결합하는 방법은 무엇입니까?

SELECT 
    goods.* 
FROM 
    goods 
JOIN filter_good ON goods.id = filter_good.goodid 
WHERE filter_good.filterid IN (3) 
AND filter_good.filterid IN (1, 2) 

을 수행 할 수 있습니다 방법 : 나는 운없이이 쿼리를 사용하여 그것을 달성하기 위해 노력하고있어?

내가 ID 3 및 ID 1 또는 2

+1

어쩌면 내가 뭔가를 놓친 거지'(1,2,3)' –

+0

IN을 filter_good.filterid @a_horse_with_no_name 아니오, 1, 2, 3 중 하나에서 필터가 일치하지만, ID가 3이고 id가 1 또는 2 인 레코드가있는 경우에만 일치해야합니다. – user2975535

+1

질문을 편집하고 일부 샘플 데이터를 추가하고 예상 한 그 데이터에 기초한 출력. [_Formatted_] (http://stackoverflow.com/editing-help#code) ** text ** please, [스크린 샷 없음] (http://meta.stackoverflow.com/questions/285551/why-may-i) 285557 # 285557) –

답변

2

음과 기록이있는 경우에만 일치하는 레코드를 반환 할 필요가 귀하의 질문에 정말 명확하지 않습니다하지만 당신은 problably EXISTS 절 필요

SELECT 
    * 
FROM 
    goods 
WHERE 
    EXISTS (
    SELECT * 
    FROM filter_good 
    WHERE goods.id = filter_good.goodid 
     AND filter_good.filterid IN (3) 
) 
    AND EXISTS (
    SELECT * 
    FROM filter_good 
    WHERE goods.id = filter_good.goodid 
     AND filter_good.filterid IN (1,2) 
) 
+0

예, 이것은 정답이지만 너무 복잡합니다. 5 개의 필터 그룹이 있다면? 다른 방법이있을 수 있습니까? – user2975535

+1

@ user2975535 : 예 다른 방법이 있습니다. 수개. 그들 중 누구도 정말 간단하지 않습니다. * 문제 *는 간단하지 않습니다 ... 자세한 힌트는 관계형 태그를보십시오. – joop

0
select g.id 
from 
    goods g 
    inner join 
    filter_good fg on g.id = fg.goodid 
group by g.id 
having bool_or(fg.filter_id = 3) and bool_or(fg.filter_id in (1,2)) 

테이블 별칭을 사용하면 명확 해집니다.

확인 다른 goods 열을 외부 쿼리에서 랩을 그것을 필요로하는 경우 bool_or aggregate function

:

select * 
from goods 
where id in (
    select g.id 
    from 
     goods g 
     inner join 
     filter_good fg on g.id = fg.goodid 
    group by g.id 
    having bool_or(fg.filter_id = 3) and bool_or(fg.filter_id in (1,2)) 
)