将产品属性 table 与产品 table 连接起来以显示产品
Joining product attributes table with the product table to display product
我有三个 table 用于列出具有产品属性的产品
具有虚拟数据的产品 Table
Product_Attributes 带有虚拟数据
具有虚拟数据的属性
Kespersky antivirus (productid = 1) 没有属性,但是 iPhone (productid =2) 有两个适用的属性,内存和分辨率都在 Attribute table 其值存储在 Product_Attribute table.
如何将这些 table 加入 show/display 具有相应属性的两个产品?
编辑
我需要将这些产品显示为
你可以试试这个:
SELECT
P.ProductName,
P.Price,
-- Add other Column Here
A.AttributeName,
PA.AttributeValue
FROM Product P
LEFT JOIN Product_Attributes PA
ON P.ProductID = PA.ProductID
LEFT JOIN Attributes A
ON PA.AttributeID = A.AttributeID
输出
ProductName Price AttbituteName AttributeValue
Kaspersky 380 NULL NULL
IPHONE 45000 Memory 64 gb
IPHONE 45000 Resolution 21500 pi
你的问题需要一个支点,需要预定义。意思是,如果您想在结果集中包含 2 个额外的 COLUMNS,则您的查询最多只能存储 2 个属性。这是一个 PRESENTATION 层问题,而不是查询层。但是,唉,我有一个通用的解决方案给你。它假定您将拥有最多 2 个属性(出于上述原因)。这是查询:
SELECT
P.ProductName,
A.AttributeName,
PA.AttributeValue,
B.AttributeName,
PB.AttributeValue
FROM lb_products P
LEFT JOIN (select row_number() over (partition by productID order by AttributeID asc) rn, *
from lb_product_attributes x) PA
ON P.ProductID = PA.ProductID and PA.rn = 1
LEFT JOIN (select row_number() over (partition by productID order by AttributeID asc) rn, *
from lb_product_attributes x) PB
ON P.ProductID = PB.ProductID and PB.rn = 2
LEFT JOIN lb_attributes A
ON PA.AttributeID = A.AttributeID
LEFT JOIN lb_attributes B
ON PB.AttributeID = B.AttributeID;
和 SQL Fiddle 供您玩耍。祝你好运!并随时提出任何问题 :)
Philip's 答案肯定是好的,他阐明了问题,如果你正在做一个枢轴,你需要定义一个静态数量的属性。不过,我不确定窗口函数是否必要,所以我会这样做:
select
prd.productId
,max(case when lpa.attributeId = 1 then attributeName else null end) attributeName1
,max(case when lpa.attributeId = 1 then attributeValue else null end) attributeValue1
,max(case when lpa.attributeId = 2 then attributeName else null end) attributeName2
,max(case when lpa.attributeId = 2 then attributeValue else null end) attributeValu2
from
lb_products prd
left outer join lb_product_attributes lpa on lpa.productId = prd.productId
left outer join lb_attributes atr on atr.attributeId = lpa.attributeId
group by
prd.productId
以下内容适用于任意数量的属性:
select product.productId, product.name,
group_concat(concat(attr.attributeName, ":", pa.attributeValue))
from product
left outer join product_attributes pa
on (pa.productId = product.productId)
left outer join attributes attr
on (attr.attributeId = pa.attributeId)
group by product.productId, product.name
我有三个 table 用于列出具有产品属性的产品
具有虚拟数据的产品 Table
Product_Attributes 带有虚拟数据
具有虚拟数据的属性
Kespersky antivirus (productid = 1) 没有属性,但是 iPhone (productid =2) 有两个适用的属性,内存和分辨率都在 Attribute table 其值存储在 Product_Attribute table.
如何将这些 table 加入 show/display 具有相应属性的两个产品?
编辑
我需要将这些产品显示为
你可以试试这个:
SELECT
P.ProductName,
P.Price,
-- Add other Column Here
A.AttributeName,
PA.AttributeValue
FROM Product P
LEFT JOIN Product_Attributes PA
ON P.ProductID = PA.ProductID
LEFT JOIN Attributes A
ON PA.AttributeID = A.AttributeID
输出
ProductName Price AttbituteName AttributeValue
Kaspersky 380 NULL NULL
IPHONE 45000 Memory 64 gb
IPHONE 45000 Resolution 21500 pi
你的问题需要一个支点,需要预定义。意思是,如果您想在结果集中包含 2 个额外的 COLUMNS,则您的查询最多只能存储 2 个属性。这是一个 PRESENTATION 层问题,而不是查询层。但是,唉,我有一个通用的解决方案给你。它假定您将拥有最多 2 个属性(出于上述原因)。这是查询:
SELECT
P.ProductName,
A.AttributeName,
PA.AttributeValue,
B.AttributeName,
PB.AttributeValue
FROM lb_products P
LEFT JOIN (select row_number() over (partition by productID order by AttributeID asc) rn, *
from lb_product_attributes x) PA
ON P.ProductID = PA.ProductID and PA.rn = 1
LEFT JOIN (select row_number() over (partition by productID order by AttributeID asc) rn, *
from lb_product_attributes x) PB
ON P.ProductID = PB.ProductID and PB.rn = 2
LEFT JOIN lb_attributes A
ON PA.AttributeID = A.AttributeID
LEFT JOIN lb_attributes B
ON PB.AttributeID = B.AttributeID;
和 SQL Fiddle 供您玩耍。祝你好运!并随时提出任何问题 :)
Philip's 答案肯定是好的,他阐明了问题,如果你正在做一个枢轴,你需要定义一个静态数量的属性。不过,我不确定窗口函数是否必要,所以我会这样做:
select
prd.productId
,max(case when lpa.attributeId = 1 then attributeName else null end) attributeName1
,max(case when lpa.attributeId = 1 then attributeValue else null end) attributeValue1
,max(case when lpa.attributeId = 2 then attributeName else null end) attributeName2
,max(case when lpa.attributeId = 2 then attributeValue else null end) attributeValu2
from
lb_products prd
left outer join lb_product_attributes lpa on lpa.productId = prd.productId
left outer join lb_attributes atr on atr.attributeId = lpa.attributeId
group by
prd.productId
以下内容适用于任意数量的属性:
select product.productId, product.name,
group_concat(concat(attr.attributeName, ":", pa.attributeValue))
from product
left outer join product_attributes pa
on (pa.productId = product.productId)
left outer join attributes attr
on (attr.attributeId = pa.attributeId)
group by product.productId, product.name