如何在OpenCart中查询不含attribute_id 17的商品ID?
解决OpenCart商品属性筛选问题:找出不含attribute_id=17的商品ID
嘿,我明白你遇到的问题了——你的SQL语句没关联主查询和子查询的product_id,所以才会没有输出结果。咱们一步步来解决这个问题:
为什么你的原SQL没结果?
你之前执行的语句:
SELECT product_id FROM oc_product_attribute WHERE NOT EXISTS (SELECT * FROM oc_product_attribute WHERE attribute_id = 17)
这里的子查询只是检查整个表里有没有attribute_id=17的记录,只要存在哪怕一条,NOT EXISTS就会把主查询的所有记录都排除,自然就没有输出了。我们需要让子查询针对每个商品做检查,而不是整个表。
正确的SQL写法(三种常用方式)
方式1:修正NOT EXISTS(关联主表与子表)
这种方法会检查每个商品是否存在attribute_id=17的属性记录,没有的话就保留:
SELECT DISTINCT pa.product_id FROM oc_product_attribute pa WHERE NOT EXISTS ( SELECT 1 -- 用1代替*更高效,不需要返回所有字段 FROM oc_product_attribute pa2 WHERE pa2.product_id = pa.product_id -- 关键:关联主查询的商品ID AND pa2.attribute_id = 17 )
加DISTINCT是因为一个商品可能有多个属性记录,避免重复输出同一个product_id。
方式2:用LEFT JOIN + IS NULL
这种方式更直观,通过左连接筛选出没有匹配到attribute_id=17的商品:
SELECT DISTINCT pa.product_id FROM oc_product_attribute pa LEFT JOIN oc_product_attribute pa2 ON pa.product_id = pa2.product_id AND pa2.attribute_id = 17 WHERE pa2.product_id IS NULL -- 没有匹配到的记录,pa2字段会是NULL
方式3:从商品主表oc_product查询(推荐)
如果你的OpenCart系统有商品主表oc_product,推荐从这里查询——这样能覆盖那些没有任何属性记录的商品(之前两种方法会漏掉这类商品):
SELECT p.product_id FROM oc_product p WHERE NOT EXISTS ( SELECT 1 FROM oc_product_attribute pa WHERE pa.product_id = p.product_id AND pa.attribute_id = 17 )
你可以根据自己的需求选择其中一种写法,执行后就能得到不含attribute_id=17的所有商品ID了。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

