我有这张桌子:

CREATE TABLE `productattributes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) DEFAULT NULL,
  `attribute_id` int(11) DEFAULT NULL,
  `value` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


样本数据:

id      product_id  attribute_id  value
651048  81546       132           0
651049  81546       133           1440
651050  81546       134           1440
707380  81546       136           1088

674291  84645       132           0
674292  84645       134           70560
674293  84645       133           144
674294  84645       136           2058
674295  84645       137           SS34
674296  84645       142           213
674297  84645       147           AB
674298  84645       154           F


我想知道product_id何时未设置attribute_id“ 136”。
根据上面的样本数据,两个产品的attribute_id“ 136”都设置为某个值。

如果一种产品不具有此属性,则即使在那里也不存在attribute_id(未设置为NULL)。
像这样:

1   5000    132 0
2   5000    133 1440
3   5000    134 1440


如何查询该表以了解哪些产品没有将attribute_id 136设置为任何值?

到目前为止,我做了什么?

SELECT DISTINCT * FROM sbb.productattributes
WHERE EXISTS(attribute_id = 136) ORDER BY product_id LIMIT 100000


这样的东西。但我知道您必须在EXIST()语句中使用第二个SELECT查询。但是对我来说,一切都在一张桌子里面。

一个完美的结果是(从上面的样本数据中看到)product_id 5000不具有attribute_id 136的值。我不希望看到其他产品,因为它们确实具有attribute_id 136的值。

最佳答案

使用NOT EXISTS排除所有attribute_id = 136的产品:

select *
from productattributes p1
where not exists (select 1 from productattributes p2
                  where p1.product_id = p2.product_id
                    and p2.attribute_id = 136)

关于mysql - 如何查找不存在 key 的实体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31269397/

10-12 00:16