2011-02-01 132 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

正如您所提到的我想选择所有根本没有的主要类别的产品(与此产品相关的所有分类不包含main = 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”和一张桌子“产品”同场“ID”字段“PRODUCT_ID”。

查询看起来像;

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

我不认为他的意志会如此。 – 2011-02-01 16:43:22

1

SELECT * FROM产品WHERE ID NOT IN(SELECT的product_id FROM product_categories WHERE主要= 1)

1

我发现在过去NOT IN证明麻烦但从性能的点。如果上述建议是缓慢的,你可能会想试试...

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

虽然作为Knuth的格言的粉丝,我建议你的代码它无论怎样你找到最简单的第一次,如果只是担心出现问题。