如何查找密钥不存在的实体

时间:2015-07-07 13:06:55

标签: mysql sql database

我有以下表格:

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的值。 / p>

1 个答案:

答案 0 :(得分:1)

使用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)