从连接多行表的查询返回单行

时间:2010-11-11 16:48:45

标签: mysql database-design

我有一个数据库设计,可以保存有关房屋的数据。有2个(相关)表 - 一个包含属性代码,名称,描述等,第二个表包含有关属性属性的信息。

目前我在属性表中有列(MaxDoubles,MaxSingles等),它们包含我需要在属性表中保存的非规范化数据(由于各种原因)。实际上,我在属性表中交换了一系列列,用于Attributes表中的一系列行。所以我现有的查询

SELECT MaxDoubles,MaxSingles FROM Properties

每个属性返回一行需要重写,以便在连接到Attributes时每个属性生成一行。如果我试试

SELECT A.MaxDoubles,A.MaxSingles FROM属性P,属性A

然后我显然每个属性返回多行。

是否有一种巧妙的方法来连接这些表,以便查询结果返回一行?

由于

3 个答案:

答案 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) 您想要执行哪些查询? 你怎么加入你的桌子?

此架构已规范化,足以允许典型的所有查询:

表格属性:

  • 物业ID
  • 的PropertyName
  • Propertydescription

表格属性:

  • 属性Id
  • 物业ID
  • 的AttributeName
  • 的AttributeValue

所以,如果你有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'