2012-01-11 2 views
1

쿼리 결과와 관련된 모든 카테고리 ID를 어떻게 반환합니까? 선택에 내가 3 CATEGORY_ID, 7
을 CATEGORY_ID 그러나 나는 또한 어떤 CATEGORY_ID의 (옵션)를 알고 싶다가있는 모든 제품 ID의를 얻을 수 아래의 쿼리에서 결과에 따라 빈 범주를 제거 하시겠습니까?

items_cats: (many to many) 
product_id | category_id 
==================== 
1   | 1 
1   | 2 
1   | 4 
1   | 7 

2   | 1 
2   | 3 
2   | 4 
2   | 7 

3   | 1 
3   | 3 
3   | 4 
3   | 8 

여전히의 producs_id 한베이스 :

예를 들어 나는이 쿼리가 반환 (코드 예제를 기반으로) 좋아 :
-product_id = 2
-category_id의 : 7, 3, 4,

1이 사용하는 아마 쿼리를 limet 싶은 것 페이지 당 최대 항목 수입니다. 내가

코드, 지금까지 도착했습니다 : 고양이 아이디의 느슨한 쿼리에

SELECT 
     DISTINCT t1.product_id, t1.category_id 
    FROM 
     items_cats t1 
    INNER JOIN 
     items_cats t1b 
     ON t1.product_id =t1b.product_id 
    WHERE 
     t1.category_id=3 AND 
     t1b.category_id=7 

문제 : 물론

SELECT 
     e1.category_id 
    FROM 
     drinks_ingredients e1  
    WHERE 
     e1.category_id=2 

그것은이 반환하지만 나는 그것을 반환하고자 1, 2, 4, 7.

다른 방법으로 작업 할 수 있지만 제품 및 범주가 많은 경우 어떻게 효율적으로 만들 수 있습니까? 그 쿼리를 결합 할 수 있습니까?

SELECT DISTINCT 
     t1.category_id 
    FROM items_cats t1 
    WHERE t1.product_id = 2 
+0

이'iid' 열이 무엇인가 product_id은 위의 표에 어디 그런 다음 우리는 단지 모든 category_id을 선택? –

+0

은 실수로 바뀌 었습니다. – Hank12312

답변

1

여기에는 다른 방법이 있지만 여기에 하나 있습니다. 먼저

, 우리는 우리가 관심있는 product_id의 해결해야 할 당신이 믿을 수있는 각 product_id가에 필요한 카테고리의 얼마나 많은 :. 우리가이 category_id (3, 7 지정된 이후

SELECT product_id, count(category_id) as numcats 
FROM items_cats 
WHERE category_id IN (3,7) 
GROUP BY product_id; 
+------------+---------+ 
| product_id | numcats | 
+------------+---------+ 
|   1 |  1 | 
|   2 |  2 | 
|   3 |  1 | 
+------------+---------+ 

), 우리는 product_id에만 관심이 있습니다 count(category_id) = 2. 그래서 마지막에 HAVING numcats=2를 추가 : 그래서 여기

SELECT product_id, COUNT(category_id) as numcats 
FROM items_cats 
WHERE category_id IN (3,7) 
GROUP BY product_id 
HAVING numcats=2; 
# (returns all product_id with both category_id=3 and 7. 

우리의 category_id들 원하는 모든 product_id들입니다.

SELECT DISTINCT category_id 
FROM items_cats 
WHERE product_id IN 
    (SELECT product_id 
    FROM items_cats 
    WHERE category_id IN (3,7) 
    GROUP BY product_id 
    HAVING COUNT(category_id)=2); 

+-------------+ 
| category_id | 
+-------------+ 
|   1 | 
|   3 | 
|   4 | 
|   7 | 
+-------------+ 
+0

당신의 솔루션을 위해 당신을 탱크에 넣으십시오. 일부 성능 테스트를 마쳤습니다. 중첩 된 db 디자인을 사용하면이 경우 쿼리의 시간이 빨라지겠습니까? – Hank12312

+0

불행히도 성능면에서 데이터베이스 디자인 모델에 대해 아무 것도 몰라요. ( –

관련 문제