Mysql 搜索不存在属性的产品ID

Mysql 搜索不存在属性的产品ID,mysql,phpmyadmin,opencart,Mysql,Phpmyadmin,Opencart,我将opencart用于在线商店,我的SQL结构如下: 来自phpmyadmin的图像 我正在尝试将产品ID与属性ID交叉匹配。 更准确地说,我需要找到没有特定属性的产品 我尝试以各种格式进行排序和导出,但没有成功。 我不擅长mysql语法,但我相信一定有办法达到这个效果 还尝试使用以下代码: 从不存在的oc_产品_属性中选择产品_id从属性_id=17的oc_产品_属性中选择* oc_product_属性是表名 …但它没有输出任何结果 请帮助我了解如何找到没有属性ID 17的产品ID 谢谢 您

我将opencart用于在线商店,我的SQL结构如下: 来自phpmyadmin的图像

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

我尝试以各种格式进行排序和导出,但没有成功。 我不擅长mysql语法,但我相信一定有办法达到这个效果

还尝试使用以下代码:

从不存在的oc_产品_属性中选择产品_id从属性_id=17的oc_产品_属性中选择* oc_product_属性是表名

…但它没有输出任何结果

请帮助我了解如何找到没有属性ID 17的产品ID


谢谢

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

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;
在您的案例中,您应该有一个产品表,可能是oc_产品。使用它可以避免多次检查。另外,可能有一个产品没有属性。如果只使用attributes表,则结果中可能会遗漏该产品

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

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子句中使用它,左连接将转换为内部连接,并且将得到一个空结果

另一种方法是使用相关的不存在子查询:

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\u id=p.product\u id。如果您在尝试中遗漏了它,子查询将始终找到一行,而NOT EXISTS将始终返回FALSE

两种方法的性能相似


如果您只需要产品id,则可以将p.*替换为p.product_id。

您需要在第一次查询中使用DISTINCT,因为一个产品可以有多个属性,每个属性可以使用多种语言。@Paul Spiegel-我确实不需要DISTINCT,因为我知道如果我没有一种语言-我没有任何语言。我只是做了一点删除重复的工作:无论如何谢谢你的输入!这也行得通,我知道这是一个更准确的解决方案。请注意,SELECT*通常是一件坏事,是一种反模式。@TimBiegeleisen可能是任何所谓的反模式-它只是一种工具,可以以错误的方式或在错误的位置使用。IMHO SELECT*是演示的好工具。它使代码保持简短,而不会分散读者对主要问题的注意力。当我编写selectp.*时,我演示了您可以从p中选择任何列。但是-对于不存在的子查询,没有任何区别,因为SELECT子句被完全忽略。