2017-02-26 2 views
0

가능한 가장 간단한 형태로 내 질문을 시도하고 자세히 설명해 보겠습니다. 전자 상거래 웹 사이트를 만들고 있는데 검색 결과에 대한 필터를 설정하려고합니다. 다음 문제가 발생할 때까지 모든 것이 잘되었습니다. ID로 그룹을 만들려고 할 때 다른 모든 외래 키를 사양 값까지 잃어 버리고 그룹을 제거하면 값에 대한 자체 외래 키를 포함하는 많은 결과를 얻습니다. (나는 각 기사를 각각의 명세 값으로 합치고있다). 따라서 내 질문은 이러한 모든 사양 ID를 어떻게 필터링합니까?다중 필터에 관한 MySQL 필터 쿼리

다음과 같이 내 쿼리 (번역 및 단순화 된)입니다 :

select * from article 
left join article_specification on article_specification.fk_articles=article.id 
where (fk_specification_value=172 or fk_specification_value=175 or fk_specification_value=184) 
group by id order by date desc 

을 내가 (따라서 그룹) 1 개 결과를 얻을이 쿼리를 실행하면, 내가 정말 그룹을 할 수없는합니까하지만 경우 결과 세트가있는 모든 것. 쿼리에서 ORS를 ANDS로 변경하면 값이 하나뿐이기 때문에 아무 것도 얻지 못합니다. 그게 내 질문의 근원이야. 미리 감사드립니다. 제 질문에 약간의 선고가 내려지면 죄송합니다.

+0

쿼리에 필요한 출력과 함께 sqlfiddle을 게시하십시오. –

+0

집계 기능을 사용하지 않고 그룹을 사용하고 있습니다. 을 사용하여 select *를 그룹별로 사용하는 것은 의미가 없습니다. 그룹별로 사용하는 모든 이유를 선택해야합니다. 궁극적으로 적절한 데이터 샘플과 예상 결과를 추가하십시오. – scaisEdge

답변

2

당신이 모든 사양을 충족하는 제품을 원하는 경우에, 당신은 할 수 있습니다 :

select a.* 
from article a join 
    article_specification ars 
    on ars.fk_articles = a.id 
where ars.fk_specification_value in (172, 175, 184) 
group by a.id 
having count(distinct ars.fk_specification_value) = 3 
order by a.date desc; 

참고 : 일반적으로, 나는 group by의 사용에 select *을 억제. 이 경우 a.id이 (아마도) article의 기본 키이기 때문에 괜찮습니다. 실제로이 group by 사용은 ANSI 표준에서 지원됩니다. 그러나 표준에서 언어를 해석하려면 "기능적 종속성"이 무엇인지 이해해야합니다.

을 만족하는 기사를 원하는 경우having 절없이 사용할 수 있습니다. 그러나 exists이 더 적절합니다.

select a.* 
from article a 
where exists (select 1 
       from article_specification ars 
       where ars.fk_articles = a.id and 
        ars.fk_specification_value in (172, 175, 184) 
      ); 
+0

이것은 내가 원하는만큼 정확하게 작동합니다. 정말 고마워요. – alps