MySQL:LEFT JOIN或UNION表并将列值设置为列名?

时间:2011-10-13 13:02:35

标签: php mysql

好的,所以我知道即使提出这样的事情我也可能会因此而感到高兴,但这让我好奇......

我们假设我有一张表:

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

和这样的表:

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

某些属性可能是

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

是否可以进行查询,以便属性的NAME列中的值表示为列名?

示例:

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
}

我知道这不遵循关系数据库,但对于一些多余的属性,它会对我有用。我想到的另一个选择是将数据存储为序列化字符串,但这让我感到畏缩。

1 个答案:

答案 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;
}