我正在将opencart用于在线商店,并且我有这样的SQL结构: (图片来自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。
谢谢!
答案 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
。