2014-11-24 4 views
0

제품 필터 기능을 만들려고하고 있는데 사용자가 선택한 항목을 기반으로 올바른 쿼리를 작성하는 데 문제가 있습니다.MySql 필터 쿼리

product_tb 
+-----------+ 
|product_sku| 
+-----------+ 
|ABC  | 
|XYZ  | 
|-----------| 

product_attribute_tb 

+-----------+--------------+---------------+ 
|product_sku|attribute_name|attribute_value| 
+-----------+--------------+---------------| 
|ABC  |colour  |red   | 
|ABC  |size   |M    | 
|XYZ  |colour  |red   | 
|XYZ  |size   |L    | 
|-----------|--------------|---------------| 

내가 무엇을 찾고 있어요 것은 모든 속성이 존재하는 경우 사용자가 선택하는 '빨간색'과 'M', 그것은 단지 ABC를 반환 그래서 만약 제품은, 돌려 주어집니다 : 테이블이 말할 수 있습니다.

이러한 특성을 제품 테이블에 넣지 않은 이유는 SaaS 응용 프로그램과 필터가 다른 응용 프로그램마다 다를 수 있기 때문입니다.

하드 코딩 된 이름으로 여러 조인을 수행 할 수 없으며 product_attribute_tb의 이름과 내용 값을 기반으로 유연한 제품을 찾기 위해 제품에 대해 40 가지 잠재적 인 필터가있을 수 있습니다.

어쩌면 나는 분명하지만 뭔가를 놓치고있다. 누군가 도움이된다면 도움이 될 것이다.

감사합니다. Martin.

+0

테이블을 다시 포맷하십시오. 무엇을 묻는 지 명확하지 않습니다. –

+0

질문이 있습니다. 모든 제품에 빨간색과 L 크기가 어떻게 표시됩니까? 이게 말이 돼? – Martin

답변

1
SELECT 
pat.product_sku 
FROM 
product_attribute_tb pat 
INNER JOIN product_tb pt ON pat.product_sku = pt.product_sku 
GROUP BY pat.product_sku 
HAVING SUM((attribute_name = 'colour' AND attribute_value = 'red') OR (attribute_name = 'size' AND attribute_value = 'L')) >= 2; 

라이브 작업 표시 1 또는 0 그런 다음 우리가 각 행에 대해 그 합계 및 확인, (attribute_name = 'colour' AND attribute_value = 'red')(attribute_name = 'size' AND attribute_value = 'L') 반환 true 또는 false와 같은 각 부울 표현식 true 경우 값은 2 이상입니다. product_tb 테이블에 자유롭게 가입하십시오.

+0

안녕하세요, 고마워 ... 그냥 참여하고 .. – Martin

+0

아무것도 이것보다 쉽습니다. 내 대답에 그것을 추가했습니다. – fancyPants

+0

가 좋아 보인다. 조금 느린 것 같지만 쿼리가 이미 복잡하기 때문에이 작업을 할 수 있습니다. 정말 감사드립니다. 감사합니다. Martin – Martin