好的,所以我知道即使提出这样的事情我也可能会因此而感到高兴,但这让我好奇......
我们假设我有一张表:
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
}
我知道这不遵循关系数据库,但对于一些多余的属性,它会对我有用。我想到的另一个选择是将数据存储为序列化字符串,但这让我感到畏缩。
答案 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;
}