2011-02-01 3 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_id» в «product_categories» и таблица «продукты» с поля «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

Я не думаю, что его работа будет работать так, как она должна быть. –

1

SELECT * FROM продуктов WHERE ID NOT IN (SELECT product_id FROM product_categories WHERE главная = 1)

1

Я обнаружил, НЕ оказаться хлопотно в прошлом с точки зрения производительности. Если приведенные выше рекомендации являются медленными, вы могли бы заботиться, чтобы попробовать ...

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

хотя, как поклонник изречение Кнута, я предлагаю вам закодировать его в зависимости от того, как вы найдете самый простой первый, и только беспокоиться об этом, если возникает проблема.