我有像这样的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>
答案 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转置数据,使用名称和年份的数组键分隔显示。
//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>