如何解决如何用MYSQL & PHP
- tbl_data
- tbl_shipped
tbl_data:
id_data | 名 | 类别 |
---|---|---|
110 | 星港 | 阿信 |
111 | 育碧 | 脚踏板 |
112 | 皮桑 | 曼尼斯 |
113 | 霸王 | 阿信 |
114 | 坦佩 | Pedas Manis |
115 | 星港 | 脚踏板 |
116 | 星港 | 曼尼斯 |
117 | 星港 | Pedas Manis |
118 | 育碧 | Pedas Manis |
119 | 育碧 | 阿信 |
120 | 皮桑 | 脚踏板 |
tbl_shipped:
id | id_data | 日期 | 金额 |
---|---|---|---|
1 | 110 | 2021-05-19 | 40 |
2 | 111 | 2021-05-21 | 31 |
3 | 112 | 2021-05-29 | 80 |
4 | 112 | 2021-06-19 | 50 |
5 | 112 | 2021-06-22 | 5 |
6 | 112 | 2021-07-30 | 23 |
7 | 113 | 2021-08-05 | 70 |
8 | 113 | 2021-08-13 | 28 |
9 | 114 | 2021-09-04 | 8 |
10 | 115 | 2021-11-10 | 67 |
11 | 115 | 2021-12-20 | 1 |
12 | 117 | 2021-05-19 | 12 |
13 | 117 | 2021-06-22 | 50 |
14 | 117 | 2021-08-05 | 21 |
15 | 120 | 2021-09-04 | 71 |
16 | 120 | 2021-11-10 | 53 |
预期结果:
名 | 类别 | 2021-05-19 | 2021-05-21 | 2021-05-29 | 2021-06-19 | 2021-06-22 | 2021-07-30 | 2021-08-05 | 2021-08-13 | 2021-09-04 | 2021-11-10 | 2021-12-20 | 总计 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
星港 | 阿信 | 40 | 40 | ||||||||||
育碧 | 脚踏板 | 31 | 31 | ||||||||||
皮桑 | 曼尼斯 | 80 | 50 | 5 | 23 | 158 | |||||||
霸王 | 阿信 | 70 | 28 | 98 | |||||||||
坦佩 | Pedas Manis | 8 | 8 | ||||||||||
星港 | 脚踏板 | 67 | 1 | 68 | |||||||||
星港 | Pedas Manis | 12 | 50 | 21 | 83 | ||||||||
皮桑 | 脚踏板 | 71 | 53 | 60 | |||||||||
全部: | 52 | 31 | 80 | 50 | 55 | 23 | 91 | 28 | 15 | 120 | 1 | 546 |
如果预期结果是上图表格中的一个支点,怎么做?
这是我尝试过的代码(来自请求),但不是最佳的:
<table>
<thead>
<?PHP include "conn.PHP";
$result = $connect->query("SELECT * FROM tbl_shipped LEFT JOIN tbl_data ON tbl_data.id_data = tbl_shipped.id_data ORDER BY tbl_shipped.date ASC"); // query-in database
$data = array();
$dates = array();
while ($row = $result->fetch_array()) { // fetching result
if(!isset($data[$row['id_data']][$row['date']])) {
$data[$row['id_data']][$row['date']] = array();
}
if(!in_array($row['date'],$dates)) {
$dates[] = $row['date'];
}
$data[$row['id_data']][$row['date']] = $row['amount'];
}
?>
<tr>
<th></th>
<?PHP foreach($dates AS $date) : ?>
<th><?=$date?></th>
<?PHP endforeach; ?>
</tr>
</thead>
<tbody>
<?PHP foreach($data AS $id => $entries) : ?>
<tr>
<td><?=$id?></th>
<?PHP foreach($dates AS $date) : ?>
<td><?=(isset($data[$id][$date])?$data[$id][$date]:'')?></td>
<?PHP endforeach; ?>
</tr>
<?PHP endforeach; ?>
</tbody>
<tfoot>
</tfoot>
</table>
基于上面的源代码,这是结果:
2021-05-19 | 2021-05-21 | 2021-05-29 | 2021-06-19 | 2021-06-22 | 2021-07-30 | 2021-08-05 | 2021-08-13 | 2021-09-04 | 2021-11-10 | 2021-12-20 | |
---|---|---|---|---|---|---|---|---|---|---|---|
110 | 40 | ||||||||||
111 | 31 | ||||||||||
112 | 80 | 50 | 5 | 23 | |||||||
113 | 70 | 28 | |||||||||
114 | 8 | ||||||||||
115 | 67 | 1 | |||||||||
117 | 12 | 50 | 21 | ||||||||
120 | 7 | 53 |
请帮帮我。我应该如何编写添加代码,我希望得到预期的结果。谢谢。
解决方法
我至少可以想到一种使用 prepared statement 的方法。考虑这个选项:
SET @sql := NULL;
SET @columns := NULL;
SET @columns := (SELECT GROUP_CONCAT(
CONCAT("SUM(CASE WHEN `date`='",dates,"'
THEN amount
ELSE 0 END) AS '","'") SEPARATOR ',')
FROM (SELECT DISTINCT `date` AS dates FROM tbl_shipped) dt);
SET @sql := CONCAT("SELECT td.id_data,td.nama,td.category,",@columns,"
FROM tbl_shipped AS ts
JOIN tbl_data AS td ON ts.id_data=td.id_data
GROUP BY td.id_data,td.category;");
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
我使用 @sql
作为最终查询结构的变量,使用 @columns
作为列结构的变量。它可以只是一个变量,但我认为这更易于阅读和编辑。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。