-1

我在网上商店工作。我的客户要求我提供未分配类别的产品列表。我以为这很容易,但它似乎并不像预期的那么容易。

我正在查看的两个表是 shop_products 和 shop_products_categories。他们有以下设置:

选购产品

  • ID,
  • 姓名,
  • 描述,
  • 价格

选购产品类别

  • shop_product_id
  • shop_category_id

我试过一个

SELECT shop_product_id 
from shop_products_categories 
WHERE NOT EXISTS (SELECT name from shop_products)

但这似乎只是从类别表中带回了所有 ID。

任何帮助或正确方向的观点将不胜感激。

此处提供了一个 SQL Fiddle

XEROX 产品没有类别。拉链袋可以。

4

4 回答 4

4

您应该能够执行以下操作,这将返回所有不在shop_products_categories表中的产品:

select p.id, p.name, p.description, p.price
from shop_products p
where not exists (select 1
                  from shop_products_categories c
                  where p.id = shop_product_id);

请参阅带有演示的 SQL Fiddle


看来您仍然有问题,我怀疑它们与列NULL中的值有关shop_category_id。也试试这个:

select p.id, p.name, p.description, p.price
from shop_products p
where not exists (select 1
                  from shop_products_categories c
                  where p.id = shop_product_id
                    and c.shop_category_id IS NOT NULL
                 ); 
于 2013-05-28T11:07:28.603 回答
2

通过子查询使用 where NOT EXISTS 通常不会提高性能,但确实有效。更常见的方法是进行 LEFT-JOIN 并查找 NULL(即:不存在)

select
      sp.id,
      sp.name,
      sp.description,
      sp.price
   from
      Shop_Products sp
         LEFT JOIN Shop_Products_Categories spc
            on sp.id = spc.shop_product_id
   where
      spc.shop_product_id is null
于 2013-05-28T11:22:00.557 回答
1

使用这个查询它可以帮助你

SELECT * FROM shop_products WHERE id NOT IN (SELECT shop_product_id FROM shop_products_categories);
于 2013-05-28T11:10:19.607 回答
0

你可以试试这个,我不确定:

Select id from shopproducts where not exist (select s.id from shopproduct as s inner    
joinshop_products_categories)

表示 productshop 的 id 在两个表的连接中不存在

于 2013-05-28T11:12:01.587 回答