选择标准(所有数据都有此条件)Sql

时间:2016-04-07 04:15:20

标签: mysql sql

对不起,如果我编辑,我有4个产品表,product_to类别,product_attribute和attribute_description。

每张桌子都有关系。

喜欢这个产品:

apple, category = 193
dell, category = 100
asus, category = 99

并且每个类别都有一个孩子喜欢(apple mac all-in-one 100(产品ID = ...),mac notebook 200(产品ID = ....)

每个儿童产品都有一些属性。 (apple mac all-in-one 100(vga,ram,dll))。

产品:

Product_id

Product_to_category :(与产品的关系)

product_id            category_id

Product_attribute :(与product和attribute_description的关系)

product_id            attribute_id

attribute_description:

attribute_id            name(vga,ram,dll)

我尝试用case选择所有属性(任何产品都有此属性)。

示例:

产品apple-1具有属性vga,ram,处理器,亮度。

产品apple-2具有属性vga,ram,processor。

产品apple-3有属性内存,操作系统,处理器,内存。

然后选择所有属性where(任何产品都有此属性)。 答案是 ram 处理器(coz,apple1-3具有此属性)。

我所知道的是从类别193(苹果)中选择所有属性1,如下所示:

SELECT DISTINCT ad.name
FROM product_to_category AS ptc
INNER JOIN product AS p ON ptc.product_id = p.product_id
INNER JOIN product_attribute AS pa ON p.product_id = pa.product_id
INNER JOIN attribute_description AS ad ON pa.attribute_id = ad.attribute_id
WHERE ptc.category_id =193

但我想从类别apple中选择所有名称属性(条件任何产品苹果都有此属性)它的平均公共属性。

我想知道,所有苹果产品所拥有的是什么。

1 个答案:

答案 0 :(得分:0)

以下是使用not exists选择与所有产品相关联的属性的方法。

select * from attribute_desc ad
where not exists (
    select 1 from product p
    left join product_to_attribute pta on pta.product_id = p.product_id
        and pta.attribute_id = ad.attribute_id
    where pta.attribute_id is null
)

not existsleft join ... null形成双重否定。换句话说,选择了没有缺少产品关联的属性。

使用子查询计算每个属性的不同产品数的另一种方法:

select attribute_id
from product_to_attribute
group by attribute_id
having count(distinct product_id) = (select count(*) from product)