2013-07-29 1 views
0

카테고리의 조건을 만족 :MySQL의 : 제품 나는 상태를 다음과 만족시키는 제품 만 원하는

제품

id int(10)  
name varchar(128) 

카테고리 : ((category_id = 1 OR category_id = 2) AND (category_id = 3 OR category_id = 4))

데이터베이스 구조를 가지고

Id int (10) 
name varchar(64) 

category_products

product_id int(10) 
category_id int(10) 

데이터 :

내 제품 세부

은 다음과 같습니다
Products: 
id name 
1 P1 
2 P2 
3 P3 
4 P4 

내 카테고리 세부

은 다음과 같습니다

Categories: 
Id name 
1 C1 
2 C2 
3 C3 
4 C4 

내 카테고리에 제품 매핑 세부 사항은 다음과 같습니다

category_products: 
product_id category_id 
1   1 
1   3 
1   4 
2   2 
3   1 
3   2 
3   3 
3   4 
4   1 
4   4 



Final Output should be: 
    id 
    1 
    3 
    4 
+1

이 절이 의미가 있습니까? 'category_id IN (1,2,3,4)'? – Raptor

+0

시작한 쿼리가 있습니까? 원하는 분야는 무엇입니까? 원하는 결과의 샘플을 게시 할 수 있습니까? – Sean

+0

귀하의 상태가 모두 'category_id'입니까? – Nithesh

답변

1
SELECT DISTINCT p.id, p.name FROM products AS p 
INNER JOIN category_products AS c1 ON c1.product_id=p.id 
INNER JOIN category_products AS c2 ON c2.product_id=p.id 
WHERE c1.category_id IN (1,2) AND c2.category_id IN (3,4) 

그것은

WHERE c.category_id IN (1,2) AND c.category_id IN (3,4) 

사용하는 작동하지 않을 것입니다 때문에 WHERE 절 테스트를 한 번에 행 하나 CATEGORY_ID는 한 행에 두 개의 값을 가질 수있는 방법은 없습니다. 따라서 자체 조인은 둘 이상의 행을 일치시키고 상관 이름으로 참조를 처리함으로써이를 처리합니다.

+0

정확히 내가 묻고있는 것은 ..! 현재에는 두 가지 AND 조건 만 있지만 실시간으로 약 10 가지 AND 조건이 있습니다! –

+0

그러면 10 개의 자체 조인을해야 할 것입니다. –

+0

답장을 보내 주셔서 감사합니다. 이 쿼리를 최적화하는 방법이 있습니까? (10 개의 자체 조인 대신) –

0

이 시도 : - 당신이 제품의 이름을 필요로하지 않기 때문에

select * 
from products 
where id in (select distinct(product_id) 
      from category_products 
      where (category_id =3 0R category_id=4) 
       AND (category_id =1 OR category_id=2)) 
+0

이것은 작동하지 않습니다. 제 수정 된 질문을 확인하십시오. –

0
SELECT p.product_id AS id FROM product_categories AS p 
WHERE (p.category_id=1 OR p.category_id=2) AND (p.category_id=3 OR p.category_id=4) GROUP BY p.category_id 

당신이 필요하지 않습니다 내부 결합. GROUP BY와 DISTINCT 모두 작동해야합니다.

+0

이것은 작동하지 않습니다. 제 수정 된 질문을 확인하십시오. –

+0

수정 사항이 더 좋습니까? – smcjones

+0

솔루션을 체크 아웃하십시오 : Bill Karwin –