You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:20:22