2011-02-01 11 views
0

私は製品テーブルを持っています - それぞれにはいくつかのカテゴリがあります。各カテゴリにはメイン列があります。 >それは私がすべてのカテゴリがに関連するすべての主要なカテゴリ(ではありませんすべての製品を選択する主なカテゴリ特定の値を持たないアイテムを選択

だ - main = 1がいる場合(。私はまた、カテゴリテーブルとproduct_categoriesテーブルを持っている)

この製品には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 * ID NOT INは、パフォーマンスの観点から、過去に面倒なことを証明しない私を発見した

1

(メイン= 1 product_categories FROMのproduct_idを選択)Productsから。上記の提案が遅い場合Knuthの格言のファンとして、私はあなたが最も簡単な最初に見つけ方方法あなたはそれをコーディングすることをお勧めしたい、と場合にのみ、それを心配していますが、...しようとする

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

ケアかもしれません問題が生じる。

関連する問題