搜索不存在属性的产品ID

时间:2019-02-09 15:45:11

标签: mysql phpmyadmin opencart

我正在将opencart用于在线商店,并且我有这样的SQL结构: data (图片来自phpmyadmin)

我正在尝试将商品ID与属性ID交叉匹配。 我需要找到没有特定attribute_id(更准确地说是attribute_id 17)的产品。

我尝试了各种格式的排序和导出,但没有成功。 我对mysql语法不太满意,但我确信必须有一种方法来实现此结果。

也尝试使用此代码:

SELECT product_id FROM oc_product_attribute WHERE NOT EXISTS (SELECT * FROM oc_product_attribute WHERE attribute_id = 17) (oc_product_attribute是表名)

...但是没有输出任何结果。

请帮助我理解如何查找没有属性ID 17的产品ID。

谢谢!

2 个答案:

答案 0 :(得分:1)

您当前的方法是正确的,但是您需要将exist子查询与外部查询关联起来

SELECT DISTINCT o1.product_id
FROM oc_product_attribute o1
WHERE NOT EXISTS (SELECT 1 FROM oc_product_attribute o2
                  WHERE o1.product_id = o2.product_id AND o2.attribute_id = 17);

我们也可以在此处使用汇总方法:

SELECT product_id
FROM oc_product_attribute
GROUP BY product_id
HAVING COUNT(attribute_id = 17) = 0;

答案 1 :(得分:1)

您应该有一个product表(在您的情况下可能是oc_product)。用它来避免多次检查。也可能有没有属性的产品。如果仅使用属性表,则会在结果中错过该产品。

有两种常见的方法可以实现目标。一种是使用左联接:

select p.*
from oc_product p
left join oc_product_attribute a
  on  a.product_id = p.product_id
  and a.attribute_id = 17
where a.product_id is null

重要的是条件a.attribute_id = 17位于ON子句中。如果在WHERE子句中使用它,则LEFT JOIN将转换为INNER JOIN,并且您将得到一个空结果。

另一种方法是使用相关的NOT EXISTS子查询:

select p.*
from oc_product p
where not exists (
    select *
    from oc_product_attribute a
    where a.product_id = p.product_id
      and a.attribute_id = 17
)

请注意(相关)条件a.product_id = p.product_id。如果您错过了它(如您的尝试),则子查询将始终找到一行,并且NOT EXISTS将始终返回FALSE。

这两种方法都具有相似的性能。

如果仅需要产品ID,则可以将p.*替换为p.product_id