微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何用MYSQL & PHP

如何解决如何用MYSQL & PHP

请帮我解决一个有 2 个表的问题:

  1. tbl_data
  2. 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 作为列结构的变量。它可以只是一个变量,但我认为这更易于阅读和编辑。

Demo fiddle

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。