php查询选择mysql到表格的列

时间:2017-10-02 14:52:38

标签: php mysql sql pivot

我有像这样的mysql表

| idx|  name  | year | month | value |
| 1  |  foo   | 2017 | 1     | bar1  |
| 2  |  foo   | 2017 | 2     | bar2  |
| 3  |  foo   | 2017 | 3     | bar3  |
| 4  |  foo   | 2017 | 4     | bar4  |

我想像这样查询网格表

| idy |  name  | year | month1  | month2 | month3 | month4 |
| 1   |  foo   | 2017 | bar1    | bar2   | bar3   | bar4   | 

如何做到这一点,非常感谢

我的意思是查询行到一行,我想填写这样的表

<table>
    <tr>
       <th>id</th>
       <th>name</th>
       <th>year</th>
       <th>month1</th>
       <th>month2</th>
       <th>month3</th>
       <th>month4</th>
    </tr>
    <tr>
       <td><?php echo $row[id]; ?></td>
       <td><?php echo $row[name]; ?></td>
       <td><?php echo $row[year]; ?></td>
       <td><?php echo $row[month1]; ?></td>
       <td><?php echo $row[month2]; ?></td>
       <td><?php echo $row[month3]; ?></td>
       <td><?php echo $row[month4]; ?></td>
    </tr>
</table>

1 个答案:

答案 0 :(得分:2)

您可以通过几种方式完成所需的工作。

第一个是带有MAX条件的组。

SELECT 
    p.name, 
    p.`year`, 
    MAX(IF(p.`month` = 1, p.value, NULL)) AS month1, 
    MAX(IF(p.`month` = 2, p.value, NULL)) AS month2,
    MAX(IF(p.`month` = 3, p.value, NULL)) AS month3,
    MAX(IF(p.`month` = 4, p.value, NULL)) AS month4
FROM table_name AS p
GROUP BY p.name, p.`year`

另一种方法是使用每个月要检索的联接。

SELECT 
  p.name,
  p.`year`, 
  m1.value AS month1, 
  m2.value AS month2, 
  m3.value AS month3, 
  m4.value AS month4
FROM table_name AS p
LEFT JOIN table_name AS m1
ON m1.name = p.name AND m1.`year` = p.`year` AND m1.`month` = 1
LEFT JOIN table_name AS m2
ON m2.name = p.name AND m2.`year` = p.`year` AND m2.`month` = 2
LEFT JOIN table_name AS m3
ON m3.name = p.name AND m3.`year` = p.`year` AND m3.`month` = 3
LEFT JOIN table_name AS m4
ON m4.name = p.name AND m4.`year` = p.`year` AND m4.`month` = 4
#....
WHERE p.name = 'foo' AND p.`year` = 2017
GROUP BY p.name, p.`year`;

演示:http://sqlfiddle.com/#!9/6de54a/3

两者的结果都是相同的,但是您的ID将不再相关,因为您将各行分组到一行中,因此我将根据您希望如何显示ID来留下它。< / p>

或者,您可以使用PHP转置数据,使用名称和年份的数组键分隔显示。

演示:https://3v4l.org/KvCD5

//SELECT * FROM table_name WHERE name = 'foo' AND `year` = '2017';

$data = [];
foreach($rows as $row) {
  $key = $row['name'] . '_' . $row['year'];
  if(!isset($data[$key])){
     $data[$key] = array(
         'id' => $row['id'],
         'name' => $row['name'],
         'year' => $row['year']
    );
  }
  $data[$key]['month' . $row['month']] = $row['value'];
}

结果:

Array
(
    [foo_2017] => Array
        (
            [id] => 1
            [name] => foo
            [year] => 2017
            [month1] => bar1
            [month2] => bar2
            [month3] => bar3
            [month4] => bar4
        )

)

然后你将遍历转置数据。

<table>
    <tr>
       <th>id</th>
       <th>name</th>
       <th>year</th>
       <th>month1</th>
       <th>month2</th>
       <th>month3</th>
       <th>month4</th>
    </tr>
<?php foreach($data as $row) { ?>
    <tr>
       <td><?php echo $row['id']; ?></td>
       <td><?php echo $row['name']; ?></td>
       <td><?php echo $row['year']; ?></td>
       <td><?php echo $row['month1']; ?></td>
       <td><?php echo $row['month2']; ?></td>
       <td><?php echo $row['month3']; ?></td>
       <td><?php echo $row['month4']; ?></td>
    </tr>
<?php } ?>
</table>