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


How to combine multiple tables data and encode json as one array?

我已经从一个月表数据中编码了json数组,如下所示,但是在合并所有数据后,如何将多个数据表与其他月份合并到一个json数组和GROUP BY dept中?

<?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);
?>

1月份产量:

[{"name":"Dept","data":["CNC","MACH","ANOD","BUFF","CAST","POLISH","SL","EPT","TUMB","TOOL","SHOT","QC","LOG","MAIN","LC","WWT","OG","NPD","E-COAT","SFT"]},{"name":"Normal","data":[47429.1,39975.7,34553.8,49075.9,28316.3,21237.1,13492.5,5848.2,7691.1,6963.9,5636.1,7555.8,5821.9,2161.2,1812,1191.7,1479.1,1299.6,11542.6,602]},{"name":"OT","data":[20041,17874,14431,13535.5,8800.5,5613.5,3569.5,3101,2327,2278,2237,2142,1810,942,690,456,297,110.5,66,50.5]}]

合并四个月后我想要什么结果:

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

有人可以帮助我解决问题吗?

我通过打印它们手动完成,我认为如果您在编码两个表的 JSON 时遇到一些问题,这是一种替代解决方案。有时具有相同名称的行会在 json_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>";
}

?>

如果您有同名的行,则应重命名另一行,就像我在上面的示例中所做的那样(questionaire_name,questionaire_description)。

它将产生以下输出:

[{ "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" }]

借助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;

因此,您在GROUP_CONCAT中的数据将根据您表达的形式进行计算。

另一种解决方案是创建一个表,该表根据 cron 作业或表触发器进行更新,并将此数据放入 JSON 字段类型中,以便以较低的 CPU 成本持续准备好进行检索。 这样,您就不会在每个查询上产生串联和表联接的额外开销。

您可以通过梳理GROUP_CONCAT和分组表来跳过许多 PHP 聚合。 多年来,我通过这个和MySQL的JSON功能的组合节省了数百小时的编程时间(下面的链接)

版本 8 引入了这些功能,您无需创建自己的 JSON,例如具有JSON_ARRAYAGG和其他出色 JSON 功能的字符串。 虽然,以上内容适用于版本 5 及更高版本。

https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat

https://dev.mysql.com/doc/refman/5.7/en/json-creation-functions.html#function_json-array

版本8:https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_group-concat