2016-01-22 36 views
1

我已经从一个月的表数据编码json数组,如下所示,但如何组合所有数据后,如何将多个数据表与其他月份在一个json数组和GROUP BY部分组合?如何合并多个表数据并将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":"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]}] 

有谁可以帮我解决这个问题?

回答

0

随着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: 例如:GROUP BY DEPT,MONTH

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_ARRAYAGG创建自己的JSON其他很棒的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

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

相关问题