Php MySQL:左联接或联合表,并将列值设置为列名?
好吧,所以我知道我可能会因为提出这样的建议而梦想成真,但这让我好奇 假设我有一张这样的桌子:Php MySQL:左联接或联合表,并将列值设置为列名?,php,mysql,Php,Mysql,好吧,所以我知道我可能会因为提出这样的建议而梦想成真,但这让我好奇 假设我有一张这样的桌子: content --------------- | id | status | 还有一张这样的桌子: attributes --------------------------- | id | pid | name | value | 某些属性可能在哪里 | 1 | 1 | status | published | | 2 | 1 | viable | yes | 是否可以执行查询,以
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
}
我知道这并不遵循关系数据库,但是对于一些多余的属性,它对我来说是有用的。我想到的另一个选择是将数据存储为序列化字符串,但这让我感到畏缩。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;
}
你知道所有要提前用作列的名称吗?或者它们是动态的?你要的是所谓的“透视表”,它们是动态的,所以我没有提前使用的名称的列表。现在阅读透视表。谢谢瘸的不是你的答案,但这可能真的很有用。我想我会用php来做。谢谢