ID上不存在的位置 - 显示结果

时间:2013-05-28 11:04:43

标签: mysql

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

我正在查看的两个表是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小提琴,here

XEROX产品没有类别。拉链袋的确如此。

4 个答案:

答案 0 :(得分: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 with Demo


您似乎仍然遇到问题,我怀疑它们与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
                 ); 

答案 1 :(得分:2)

通过子查询使用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

答案 2 :(得分:1)

使用此查询可能会对您有所帮助

SELECT * FROM shop_products WHERE id NOT IN (SELECT shop_product_id FROM shop_products_categories);

答案 3 :(得分:0)

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

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

意味着来自producthop的id不存在于两个表的连接中