2010-11-11 18 views
0

我有一個數據庫設計,它包含有關房屋數據。有2個(相關)表 - 一個保存屬性代碼,名稱,描述等等,並且所述第二保持關於屬性的屬性的信息。從查詢,返回單列加入多行表

在屬性表目前我有柱(MaxDoubles,MaxSingles等),其持有的屬性表,我需要現在持有(因各種原因)去歸一化數據。實際上,我正在交換屬性表中的一系列列,以查找屬性表中的一系列行。所以,我現有的查詢

SELECT MaxDoubles,MaxSingles FROM屬性

返回每個屬性需要一個行重新書寫時加入的屬性也產生每財產一行。如果我嘗試

SELECT A.MaxDoubles,A.MaxSingles FROM屬性P,屬性一個

那麼我顯然得到每屬性返回多行。

是否有這樣的查詢結果返回單行連接這些表的一個聰明的辦法?

謝謝

+0

請給我們表的定義。另外,你的第二個查詢至少缺少WHERE子句來正確地加入 - 或者,最好是將屬性作爲P內聯屬性作爲A在P.blah = A.blah上。逗號表示法已被棄用大約18年。 – Stu 2010-11-11 16:53:22

+0

我們需要看到'Attributes'的模式。 – RedFilter 2010-11-11 16:55:08

回答

0

我們需要更多的信息來處理您的問題。例如:

你的表格是什麼樣的(SHOW CREATE TABLE Properties) 你想執行什麼查詢? 你如何加入你的餐桌?

這個模式有足夠的標準化,讓所有典型查詢:

表屬性:

  • 物業ID
  • 屬性名
  • Propertydescription

表ATT ributes:

  • 屬性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 

現在,如果你はNT知道你家有多少房有,你可以問

SELECT A.AttributeValue from Attributes A 
INNER JOIN Properties P 
ON P.PropertyID = A.PropertyID 
WHERE P.PropertyID = 1 
and A.AttributeName = 'NrBedrooms' 
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

假設像@ Konerak的例子一個模式,你需要 「軸」 的屬性記錄,如果你想要一行包含一個屬性及其所有屬性。

幸運的是,關於如何做到這一點的SO的信息there is no shortage。 :)

+0

+1我沒有拿出關鍵字。 – AndreKR 2010-11-11 17:13:01