Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:左联接或联合表,并将列值设置为列名?_Php_Mysql - Fatal编程技术网

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来做。谢谢