如何循环 php mysqli_query 以将数据输入 google 组合图表

How to loop php mysqli_query as to input data into google combochart

我目前正在做一个大学管理系统,想显示一个关于每个课程每月注册学生总数的组合图表。

就我而言,有:

我目前所做的是为 DICS 创建 6 个查询,每个查询 6 个月,并分别为 DIHM 和 DIBA 创建另外 6 个查询,我知道这是一种愚蠢且不足的方法。

我的图表如下所示: My combo chart

组合图的源代码如下:Google chart

这是我前 3 个月的 sql 查询示例:

$DICS_users_072019 = "SELECT * FROM users WHERE course = 'DICS' AND enroll_month = 072019";
$select_DICS_072019 = mysqli_query($connection,$DICS_users_072019);  
$total_DICS_072019 = mysqli_num_rows($select_DICS_072019);
echo $total_DICS_072019;

$DICS_users_082019 = "SELECT * FROM users WHERE course = 'DICS' AND enroll_month = 092019";
$select_DICS_082019 = mysqli_query($connection,$DICS_users_082019);  
$total_DICS_082019 = mysqli_num_rows($select_DICS_082019);
echo $total_DICS_082019;

$DICS_users_092019 = "SELECT * FROM users WHERE course = 'DICS' AND enroll_month = 092019";
$select_DICS_092019 = mysqli_query($connection,$DICS_users_092019);  
$total_DICS_092019 = mysqli_num_rows($select_DICS_092019);
echo $total_DICS_092019;

这就是我将动态数据作为输入插入组合图表的方式:

 <script type="text/javascript">
 google.charts.load('current', {'packages':['corechart']});
 google.charts.setOnLoadCallback(drawVisualization);

     function drawVisualization() {
     // Some raw data (not necessarily accurate)
        var data = google.visualization.arrayToDataTable([
              ['Month',   'DIHM',   'DICS',      'DIBA'],   
        <?php

        $enrol_month = ['07/2019','08/2019','09/2019'];
        $DICS_nums = [$total_DICS_072019 , $total_DICS_082019 , $total_DICS_092019];
        $DIHM_nums = [$total_DIHM_072019 , $total_DIHM_082019 , $total_DIHM_092019];
        $DIBA_nums = [$total_DIBA_072019 , $total_DIBA_082019 , $total_DIBA_092019];

        for($i = 0;i< 3;i++){

        echo "['{$enrol_month[$i]}'" . "," . "'{$DICS_nums[$i]}'" . "'{$DIHM_nums[$i]}'" . "'{$DIBA_nums[$i]}']";

        }

        ?>
                ]);

        var options = {
           title : 'Total Admission of Students per Courses',
           vAxis: {title: 'Numbers'},
           hAxis: {title: 'Month'},
           seriesType: 'bars',
           series: {5: {type: 'line'}}        };

           var chart = new google.visualization.ComboChart(document.getElementById('chart_div'));
              chart.draw(data, options);
           }
</script>       

那么有什么方法可以让它变得更简单吗?我正在考虑将它放入 foreach 循环并执行 "WHERE course = '{x}' AND enrol_month = '{y}';" 之类的操作并将结果存储到关联数组中。这是完成此操作的有效方法吗?

查询可以按月分组,每列使用case语句。

SELECT
  enroll_month,
  sum(case when course = 'DIHM' then 1 else 0 end) as DIHM,
  sum(case when course = 'DICS' then 1 else 0 end) as DICS,
  sum(case when course = 'DIBA' then 1 else 0 end) as DIBA
FROM
  users
GROUP BY
  enroll_month

// build query
$query = "SELECT enroll_month, ";
$query .= "sum(case when course = 'DIHM' then 1 else 0 end) as DIHM, ";
$query .= "sum(case when course = 'DICS' then 1 else 0 end) as DICS, ";
$query .= "sum(case when course = 'DIBA' then 1 else 0 end) as DIBA ";
$query .= "FROM users ";
$query .= "GROUP BY enroll_month ";

然后将数据加载到数组中...

// build data table
$table = [];
$table[] = ['Month', 'DIHM', 'DICS', 'DIBA'];

// get data
$result = mysqli_query($connection,$query);
while($row = mysqli_fetch_array($result)) {
  // add row to data table
  $table[] = [$row["enroll_month"], $row["DIHM"], $row["DICS"], $row["DIBA"]];
}

并创建数据table...

var data = google.visualization.arrayToDataTable(<?php echo json_encode($table); ?>);