繁体   English   中英

从查询联接多行表返回单行

[英]Returning a single row from query joining multi-row tables

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

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

从属性中选择MaxDoubles,MaxSingles

返回每个属性一行的属性需要重新编写,以便在连接到属性时也可以为每个属性产生一行。 如果我尝试

从属性P中选择SELECT A.MaxDoubles,A.MaxSingles,属性A

那么我显然会为每个属性返回多个行。

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

谢谢

假设像@Konerak的示例这样的架构,如果要包含属性及其所有属性的一行,则需要“透视”属性记录。

幸运的是,关于SO的信息并不缺乏 :)

您现在拥有的被称为EAV数据结构,而您想要做的被称为“枢纽”。 除了使用子选择之外,还有两种可能性。

使用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')

我们将需要您提供更多信息来解决您的问题。 例如:

您的表是什么样子( SHOW CREATE TABLE Properties )您想执行什么查询? 您如何加入餐桌?

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

表属性:

  • PropertyID
  • 属性名称
  • 物业描述

表格属性:

  • AttributeID
  • PropertyID
  • AttributeName
  • 属性值

因此,如果您拥有物业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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM