2012-01-24 123 views
3

我正在嘗試編寫一個從3個表中拉出來的SQL查詢,並且無法實現我需要的結果。我想返回與特定類別配對的所有屬性名稱(標籤),並將這些屬性與來自該類別中特定資產的值配對,該值可能沒有與每個屬性配對的值。3表,SQL查詢

我想所有的屬性,類別4,與值配對的資產135。資產135沒有財產3或4的設定值,所以我想:

| property_name | property_value  | 
|:--------------|:-------------------| 
| Fixture ID | A5     | 
| Manufacturer | Black & Decker  | 
| Model #  |     | 
| Type   |     | 

這裏是我的查詢:

SELECT property.property_name, asset_property.property_value 
FROM property 
LEFT OUTER JOIN category_property 
ON property.property_id = category_property.property_id 
INNER JOIN asset_property 
ON asset_property.property_id = property.property_id 
WHERE category_property.category_id = 4 
AND asset_property.asset_id = 135 

得到的數據

| property_name | property_value  | 
|:--------------|:-------------------| 
| Fixture ID | A5     | 
| Manufacturer | Black & Decker  | 

這是因爲我的缺失2屬性AND asset_property.asset_id = 135

H是表: *星號僅表示測試用例中的行。

表:財產

| property_id | property_name | 
|:-----------:|:--------------| 
| 1   | Fixture ID |* 
| 2   | Manufacturer |* 
| 3   | Model #  |* 
| 4   | Type   |* 
| 5   | Lamp Type  | 

表:asset_property
與屬性值對資產。

| asset_id | property_id | property_value | 
|:--------:|:-----------:|:---------------| 
| 129  | 1   | A5    | 
| 129  | 2   | Black & Decker | 
| 129  | 3   | 1230-02  | 
| 129  | 4   | Incandescent | 
| 135  | 1   | E6    |* 
| 135  | 2   | Linden   |* 
| 147  | 1   | G1    | 

表:category_property
對類別與它的屬性。

| category_id | property_id | 
|:-----------:|:-----------:| 
| 4   | 1   |* 
| 4   | 2   |* 
| 4   | 3   |* 
| 4   | 4   |* 
| 7   | 2   | 
| 7   | 5   | 

我試過所有不同的JOIN類型,HAVING,GROUP BY ....找不到它。如果有人明白我需要什麼,我會非常感激幫助!謝謝!


爲了澄清,我需要回到這些套的成績:在property_id

| property_name | 
|:--------------| 
| Fixture ID | 
| Manufacturer | 
| Model #  | 
| Type   | 

| property_value | 
|:---------------| 
| A5    | 
| Black & Decker | 

加入他們的行列:

| property_name | property_value | 
|:--------------|:---------------| 
| Fixture ID | A5    | 
| Manufacturer | Black & Decker | 
| Model #  | 
| Type   | 

但由於沒有記錄4和5在asset_property table中,這些屬性的property_name沒有顯示。

| property_name | property_value | 
|:--------------|:---------------| 
| Fixture ID | A5    | 
| Manufacturer | Black & Decker | 

型號
類型

我希望他們到E所示。我要全部類別4的產權名稱將被退回並與資產135的任何匹配property_values配對。


所以對於水果類我希望所有的屬性名稱返回(顏色,季節,味道)。顏色屬性蘋果沒有確定,但我還是想返回所有的屬性類型,因此它們可以被改變或填寫:

| property_name | property_value | 
|:--------------|:---------------| 
| Color   |    | 
| Season  | Fall   | 
| Taste   | Tart   | 
+0

你想要的結果是遠離標準化表的一個支點。如果可以的話,考慮規範化你的模式,這使得查詢更簡單。這個模式看起來像Magento對我來說,你無法控制,但如果它是自定義的,你可以節省一些工作。 –

回答

5

只要改變INNER JOINLEFT OUTER JOIN,並從移動AND asset_property.asset_id = 135WHERE條款的ON條款:

SELECT property.property_name, 
     asset_property.property_value 
    FROM property 
INNER 
    JOIN category_property 
    ON property.property_id = category_property.property_id 
    LEFT 
OUTER 
    JOIN asset_property 
    ON asset_property.property_id = property.property_id 
    AND asset_property.asset_id = 135 
WHERE category_property.category_id = 4 
; 

(我也改變了第一LEFT OUTER JOININNER JOIN,因爲WHERE category_property.category_id = 4會(正確地)過濾掉其中加入失敗的記錄,反正)

+0

如果我向asset_property添加了一行並且保留了asset_id * NULL *,** OR **語句開始了,但是我需要* ALL *來自'WHERE category_property.category_id = 4'的匹配項,並且從' assed_id = 135',但不限制它們。 –

+0

@flackend:有趣!在Oracle中,我提到的兩個選項都是可用的選項(我測試過),但事實證明,在MySQL(以及PostgreSQL,可能還有其他DMBS)中,只有其中一個有效。我編輯了我的答案,刪除了在MySQL中不起作用的選項。對於那個很抱歉! – ruakh

+0

你搖滾!非常感謝!! –