2011-10-13 74 views
3

好了,所以我知道我可能會用於擴孔甚至暗示這樣的事情,但它有我好奇...MySQL:LEFT JOIN或UNION表,並將列值設置爲列名?

讓我們假設我有這樣一個表:

content 
--------------- 
| id | status | 

和像這樣的表:

attributes 
--------------------------- 
| id | pid | name | value | 

其中一些屬性可能是

| 1 | 1 | status | published | 
| 2 | 1 | viable | yes  | 

是可以做查詢,以便名稱列中的屬性值將表示爲列名稱?

例子:

SELECT a.name AS {a.name value} FROM content c LEFT JOIN attributes a ON a.pid = c.id 

所以,當我通過運行結果我可以做類似

foreach($result as $r){ 
    echo $r->viable; //yes 
    echo $r->status; //published 
} 

我知道這不符合關係型數據庫福,但它是有用的我一些多餘的屬性。我想到的另一個選擇是將數據存儲爲一個序列化的字符串,但這讓我感到畏縮。

+0

你知道所有的名字被用作提前列,或者是他們的動態? –

+1

你所要求的稱爲「數據透視表」http://stackoverflow.com/search?q=mysql+pivot+table http://stackoverflow.com/search?q=%5Bmysql%5D+rows+到+列 –

+0

他們是動態的,所以我沒有提前列出他們的清單。 –

回答

2

MySQL對於數據透視查詢沒有本地支持,並且它不能將任意數量的行轉換爲列,因爲列必須提前知道。換句話說,你必須用PHP來做到這一點。

我不確定是否可以從您的查詢返回多個對象(每個對象希望只有一行,但您已經承認缺乏規範化)。如果每次只返回一個,則更簡單。然而,我要承擔多單可退還,他們是在pid鍵:

$content = array(); 
while ($row = $result->fetch()) { 
    //Prevent a PHP warning; this step can be skipped 
    if (!isset($content[$row->pid])) { 
     $content[$row->pid] = array(); 
    } 

    $content[$row->pid][$row->name] = $row->value; 
} 
+0

跛腳。不是你的答案,但這可能是非常有用的。我想我會用php來做。謝謝。 –