2011-02-01 6 views
0

제품 테이블이 있습니다. 각 테이블에는 여러 가지 범주가 있습니다. 각 카테고리에는 기본 열이 있습니다. (나는 또한 범주 테이블과 product_categories 테이블이 있습니다.)특정 값이없는 항목 선택

main = 1이있는 경우 - 그것은

내가 관련된 모든 주요 카테고리에없는 모든 제품 (모든 카테고리를 선택하고자하는 메인 카테고리를 제품> 이 제품에는 main = 1 열이 없습니다).

SELECT * 
    FROM categories 
WHERE id IN (SELECT DISTINCT category_id 
       FROM `product_categories` 
       WHERE main = 1); 

가 어떻게 메인 카테고리없이 제품을 찾을 수 있습니까 :

이 모든 주요 카테고리를 선택하는 방법은?

답변

2

으로 문의하십시오. 은 기본 카테고리가 모두이 아닌 제품을 모두 선택하십시오 (이 제품과 관련된 모든 카테고리에는 기본 = 1 열이 없습니다).

이것은

select * from products where prod_id not in (select distinct prod_id from categories where main =1); 

내가 종류의 그것을 시도 후 당신이있어 것입니다.

mysql> desc products; 
+---------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+---------+--------------+------+-----+---------+-------+ 
| prod_id | int(11)  | YES |  | NULL |  | 
| name | varchar(100) | YES |  | NULL |  | 
+---------+--------------+------+-----+---------+-------+ 
2 rows in set (0.01 sec) 

mysql> desc categories; 
+---------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+---------+---------+------+-----+---------+-------+ 
| prod_id | int(11) | YES |  | NULL |  | 
| cat_id | int(11) | YES |  | NULL |  | 
| main | int(11) | YES |  | NULL |  | 
+---------+---------+------+-----+---------+-------+ 
3 rows in set (0.00 sec) 

mysql> select * from products; 
+---------+-------+ 
| prod_id | name | 
+---------+-------+ 
|  1 | prod1 | 
|  2 | prod2 | 
|  3 | prod3 | 
|  4 | prod4 | 
+---------+-------+ 
4 rows in set (0.00 sec) 

mysql> select * from categories; 
+---------+--------+------+ 
| prod_id | cat_id | main | 
+---------+--------+------+ 
|  1 |  1 | 1 | 
|  1 |  2 | 2 | 
|  2 |  1 | 2 | 
|  2 |  1 | 3 | 
|  3 |  2 | 1 | 
|  3 |  4 | 2 | 
+---------+--------+------+ 
6 rows in set (0.00 sec) 

mysql> select * from products where prod_id not in (select distinct prod_id from categories where main =1); 
+---------+-------+ 
| prod_id | name | 
+---------+-------+ 
|  2 | prod2 | 
|  4 | prod4 | 
+---------+-------+ 
2 rows in set (0.00 sec) 
0

"product_categories"필드에 "product_id"가 있고 "id"필드에 "products"테이블이있는 경우

쿼리는 다음과 같습니다. 제품의

select p.* 
from products p 
left join product_categories pc on pc.product_id = p.id and pc.main = 1 
where pc.category_id is null 
group by p.id 
+0

나는 그 사람이 생각했던대로 일하지 않을 것이라고 생각합니다. –

1

SELECT * WHERE ID NOT IN (product_categories로부터 PRODUCT_ID을 선택 WHERE 주 = 1) 나는 성능의 관점에서 과거에 골칫거리 증명하지 발견

1

. 위의 제안이 느린 경우에, 당신은 크 누스의 의견의 팬, 내가 좋을 것 같은

SELECT * 
    FROM PRODUCTS 
    WHERE NOT EXISTS (SELECT * 
          FROM PRODUCT_CATEGORIES 
          WHERE MAIN = 1 AND 
           PRODUCT_CATEGORIES.PRODUCT_ID = PRODUCTS.ID) 

당신이 첫번째 쉬운을 찾을 중 식으로 코드를하지만 ... 시도하는 신경, 그리고 경우에만 그것에 대해 걱정 수도 문제가 발생한다.