2011-10-13 70 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来做。谢谢。 –