Php 如何组合多个表数据并将json编码为一个数组?

Php 如何组合多个表数据并将json编码为一个数组?,php,mysql,json,Php,Mysql,Json,我已经对一个月表数据的json数组进行了编码,如下所示,但在合并所有数据后,如何将多个数据表与其他月份合并到一个json数组中,并按部门分组 <?php include("dbconfig.php"); $sql = "SELECT dept, SUM(ttlot) AS sum_ot, SUM(ttlnorm) AS sum_norm FROM month_jan GROUP BY dept ORDER BY sum_ot DESC";

我已经对一个月表数据的json数组进行了编码,如下所示,但在合并所有数据后,如何将多个数据表与其他月份合并到一个json数组中,并按部门分组

<?php

include("dbconfig.php");

$sql = "SELECT dept, SUM(ttlot) AS sum_ot, SUM(ttlnorm) AS sum_norm
        FROM month_jan
        GROUP BY dept
        ORDER BY sum_ot DESC";

$result = mysqli_query($dbconfig, $sql) or die("Error in Selecting " . mysqli_error($dbconfig));

$category = array();
$category['name'] = 'Dept';

$series1 = array();
$series1['name'] = 'Normal';

$series2 = array();
$series2['name'] = 'OT';

$emparray = array();
while ($row = mysqli_fetch_assoc($result)) {

$category['data'][] = $row['dept'];
$series1['data'][] = $row['sum_norm'];
$series2['data'][] = $row['sum_ot'];

}

$result = array();
array_push($result,$category);
array_push($result,$series1);
array_push($result,$series2);

$json = json_encode($result,JSON_NUMERIC_CHECK);

echo $json;

mysqli_close($dbconfig);
?>
四个月后我想要什么结果:

[{"name":"Month","data":["Jan","Feb","Mac","Apr"]},{"name":"Normal","data":[504291,409757,295538,430759]},{"name":"OT","data":[89041,96874,81431,80535]}]

有人能帮我解决这个问题吗?

有了MySQL的JSON功能和GROUP_CONCAT的组合,你可以通过组合表来做一些非常棒的事情:

您期望的结果:

[{"name":"Month","data":["Jan","Feb","Mac","Apr"]},{"name":"Normal","data":[504291,409757,295538,430759]},{"name":"OT","data":[89041,96874,81431,80535]}]
利用GROUP_CONCAT,您不需要连接表,只需按字段分组即可聚合字段:

SELECT
  CONCAT('{\"NAME\" : \"NORMAL\",',
  '\"data\": [',  GROUP_CONCAT( '"', SUM(ttlnorm), '"'), ']},',
  '{\"NAME\" : \"OT\",',
  '\"data\": [',  GROUP_CONCAT( '"', SUM(ttlot), '"'), ']}',
  )
  from month_jan
  GROUP BY dept;
如果您使用按月存储的表结构(“month_jan”),则需要在月份之间执行并集或更改表结构,以便将所有需要的月份包含在同一个表中。您可以根据分组依据在多个级别上执行连接。例如,如果有两个group by字段,则可以嵌套JSON: 例:按部门、月份分组

SELECT
  CONCAT('{',
  '\"DEPT\" :\"', dept,'\",',
  '{\"NAME\" : \"Month\",',
  '\"data\": [',  GROUP_CONCAT( '"', month, '"'), ']},',
  '{\"NAME\" : \"NORMAL\",',
  '\"data\": [',  GROUP_CONCAT( '"', SUM(ttlnorm), '"'), ']},',
  '{\"NAME\" : \"OT\",',
  '\"data\": [',  GROUP_CONCAT( '"', SUM(ttlot), '"'), ']}',
  )
  from ttl_ot_norm
  GROUP BY dept, month;
因此,您所在小组的数据将根据您所表达的形式进行计算

另一种解决方案是创建一个基于cron作业或表触发器进行更新的表,并将该数据放入JSON字段类型中,以便以低廉的CPU成本不断地进行检索。这样,您就不会在每个查询上增加连接和表连接的额外开销

通过组合GROUP_CONCAT并对表进行分组,可以跳过很多PHP聚合。这些年来,我通过这个和MySQL的JSON特性(下面的链接)的结合节省了数百小时的编程时间

版本8引入了这些特性,您不需要使用JSON_ARRAYAGG和其他出色的JSON特性创建自己的类似JSON的字符串。尽管如此,上述内容仍适用于版本5及更高版本

第8版:

我是通过打印它们手动完成的,如果您在编码两个表的JSON时遇到一些问题,我认为这是一个替代解决方案。 有时,同名行在json\u encode()函数上产生错误

<?php
session_start();

require("../config.php");
$output = array();

$id = $_GET['id'];

if(isset($_SESSION['user'])){
    $f_data ='';
    $sql = "SELECT * FROM quiz WHERE subject_id=$id ORDER BY id DESC";
    $query=$conn->query($sql);
    while($row=$query->fetch_array()){
        $sql2 = "SELECT * FROM q_details WHERE id=$row[2] ORDER BY id DESC LIMIT 1";
        $query2=$conn->query($sql2);
        while($row2=$query2->fetch_array()){
            $f_data .= '{
                    "id":"'.$row[0].'",
                    "subject_id":"'.$row[1].'",
                    "questionaire_id":"'.$row[2].'",
                    "name":"'.$row[3].'",
                    "description":"'.$row[4].'",
                    "start":"'.$row[5].'",
                    "end":"'.$row[6].'",
                    "date":"'.$row[7].'",
                    "questionaire_name":"'.$row2[2].'",
                    "questionaire_description":"'.$row2[3].'"
                    },';
        }
    }
     $f_data = substr($f_data, 0, -1);
     echo '['.$f_data.']';
}
else{
    echo"<script>window.open('http://localhost/lnhs_app/#/','_self')</script>";
}
<?php
session_start();

require("../config.php");
$output = array();

$id = $_GET['id'];

if(isset($_SESSION['user'])){
    $f_data ='';
    $sql = "SELECT * FROM quiz WHERE subject_id=$id ORDER BY id DESC";
    $query=$conn->query($sql);
    while($row=$query->fetch_array()){
        $sql2 = "SELECT * FROM q_details WHERE id=$row[2] ORDER BY id DESC LIMIT 1";
        $query2=$conn->query($sql2);
        while($row2=$query2->fetch_array()){
            $f_data .= '{
                    "id":"'.$row[0].'",
                    "subject_id":"'.$row[1].'",
                    "questionaire_id":"'.$row[2].'",
                    "name":"'.$row[3].'",
                    "description":"'.$row[4].'",
                    "start":"'.$row[5].'",
                    "end":"'.$row[6].'",
                    "date":"'.$row[7].'",
                    "questionaire_name":"'.$row2[2].'",
                    "questionaire_description":"'.$row2[3].'"
                    },';
        }
    }
     $f_data = substr($f_data, 0, -1);
     echo '['.$f_data.']';
}
else{
    echo"<script>window.open('http://localhost/lnhs_app/#/','_self')</script>";
}
[{ "id":"1", "subject_id":"2", "questionaire_id":"1", "name":"Quiz 1", "description":"Answer this quiz within 1 hour", "start":"7:30AM", "end":"8:30AM", "date":"08-01-18", "questionaire_name":"Right triangle", "questionaire_description":"Questionaire # 1" }]