2011-02-01 133 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的格言的粉絲,我建議你的代碼它無論怎樣你找到最簡單的第一次,如果只是擔心出現問題。