我有一个数据库设计,可以保存有关房屋的数据。有2个(相关)表 - 一个包含属性代码,名称,描述等,第二个表包含有关属性属性的信息。
目前我在属性表中有列(MaxDoubles,MaxSingles等),它们包含我需要在属性表中保存的非规范化数据(由于各种原因)。实际上,我在属性表中交换了一系列列,用于Attributes表中的一系列行。所以我现有的查询
SELECT MaxDoubles,MaxSingles FROM Properties
每个属性返回一行需要重写,以便在连接到Attributes时每个属性生成一行。如果我试试
SELECT A.MaxDoubles,A.MaxSingles FROM属性P,属性A
然后我显然每个属性返回多行。
是否有一种巧妙的方法来连接这些表,以便查询结果返回一行?
由于
答案 0 :(得分:2)
假设有一个类似@Konerak的示例,如果您想要一行包含属性及其所有属性,则需要“转动”属性记录。
幸运的是,there is no shortage关于如何做到这一点的信息。 :)
答案 1 :(得分:1)
你现在拥有的是EAV data structure,你想要做的就是“转动”。除了使用子选择外,还有两种可能性。
使用GROUP BY:
SELECT P.Property_ID,
MAX(IF(A.Type = 'maxsingles',A.Value,0)) AS MaxSingles,
MAX(IF(A.Type = 'maxdoubles',A.Value,0)) AS MaxDoubles
FROM Properties P
JOIN Attributes A USING (Property_ID)
GROUP BY Property_ID
为每个属性使用一个JOIN:
SELECT P.Property_ID, A1.Value AS MaxSingles, A2.Value AS MaxDoubles
FROM Properties P
JOIN Attributes A1 ON (A1.Property_ID = P.Property_ID AND A1.Type = 'maxsingles')
JOIN Attributes A2 ON (A2.Property_ID = P.Property_ID AND A2.Type = 'maxdoubles')
答案 2 :(得分:0)
我们需要您提供更多信息来处理您的问题。例如:
你的表格是什么样的(SHOW CREATE TABLE Properties
)
您想要执行哪些查询?
你怎么加入你的桌子?
此架构已规范化,足以允许典型的所有查询:
表格属性:
表格属性:
所以,如果你有1号房产,3间卧室的白宫,你可以拥有
PropertyID: 1
PropertyName: Charming white landhouse with 3 spacious bedrooms
Propertydescription: This charming landhouse will ...
Attributes
AttributeID: 1
PropertyID: 1
AttributeName: NrBedrooms
AttributeValue: 3
AttributeID: 2
PropertyID: 1
AttributeName: NrBathrooms
AttributeValue: 2
AttributeID: 3
PropertyID: 1
AttributeName: Kitchen
AttributeValue: Fully Equiped
现在,如果您想知道您的房子有多少卧室,您可以询问
SELECT A.AttributeValue from Attributes A
INNER JOIN Properties P
ON P.PropertyID = A.PropertyID
WHERE P.PropertyID = 1
and A.AttributeName = 'NrBedrooms'