对不起,如果我编辑,我有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中选择所有名称属性(条件任何产品苹果都有此属性)它的平均公共属性。
我想知道,所有苹果产品所拥有的是什么。
答案 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 exists
和left join ... null
形成双重否定。换句话说,选择了没有缺少产品关联的属性。
使用子查询计算每个属性的不同产品数的另一种方法:
select attribute_id
from product_to_attribute
group by attribute_id
having count(distinct product_id) = (select count(*) from product)