【问题标题】:How make table data from vertical to horizontal with MYSQL & PHP如何使用 MYSQL 和 PHP 将表格数据从垂直变为水平
【发布时间】:2021-09-30 14:12:14
【问题描述】:

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

  1. tbl_data
  2. tbl_shipped

tbl_data:

id_data nama category
110 Singkong Asin
111 Ubi Pedas
112 Pisang Manis
113 Bawang Asin
114 Tempe Pedas Manis
115 Singkong Pedas
116 Singkong Manis
117 Singkong Pedas Manis
118 Ubi Pedas Manis
119 Ubi Asin
120 Pisang Pedas

tbl_shipped:

id id_data date amount
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

预期结果:

nama category 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 Total
Singkong Asin 40 40
Ubi Pedas 31 31
Pisang Manis 80 50 5 23 158
Bawang Asin 70 28 98
Tempe Pedas Manis 8 8
Singkong Pedas 67 1 68
Singkong Pedas Manis 12 50 21 83
Pisang Pedas 71 53 60
All Total : 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

请帮助我。我应该如何编写添加代码,我希望得到预期的结果。谢谢。

【问题讨论】:

  • 你有没有尝试过研究这个或自己编写任何代码?我们很乐意帮助这里的人们,但这不是免费的“我的工作”服务。我很确定您不是第一个询问如何转换他们的数据的人......
  • 请不要发布图片。我们很乐意提供帮助,但重新创建数据样本的文本形式比重新编写图像上的所有内容要快得多。根据您的图片,您已经拥有 ASCII 表格格式的图片,所以您为什么不直接复制并粘贴 into your question
  • 这能回答你的问题吗? How can I return pivot table output in MySQL?
  • 好的,感谢您的意见@ADyson 所以,我的代码仍然在代码应用程序中出错。
  • 如果您有一些代码,请与我们分享,并包含一些关于它当前输出的信息,无论是一些错误消息,还是错误的结果或其他什么。这至少会给我们一个起点。如果您在将其包含在您的问题中时遇到问题,那么 a) 阅读 stackoverflow.com/help/formatting 和 b) 确保您包含我刚才提到的足够描述,因为编辑器不喜欢纯代码帖子 - 它试图鼓励您解释您的问题,只需提供代码即可。

标签: php mysql arrays multidimensional-array foreach


【解决方案1】:

我至少可以想到一种使用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 '",dates,"'") 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.nama, td.category;");

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我使用@sql 作为最终查询结构的变量,使用@columns 作为列结构的变量。它可以只是一个变量,但我认为这更易于阅读和编辑。

Demo fiddle

【讨论】:

  • 感谢您的回答参与@FaNo_FN,我已经看过您的代码(演示)我的意见似乎合乎逻辑,但是,对不起,我是使用mysql的初学者,如果我们在表格上的php中编写脚本如何显示数据,就像我上面的源代码一样。请帮我提供反馈,谢谢。
  • @Imamaqrom 您可以将此 SQL 代码放入存储过程中,然后您可以从 PHP 执行该存储过程。由于(根据演示)此 SQL 已经生成了您需要的确切表,因此您的 PHP 代码只需遍历结果并将它们输出为 HTML 表,无需复杂的处理。
猜你喜欢
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
相关资源
最近更新 更多