从MYSQL PHP创建嵌套JSON时只得到一个结果
我对mysql和php都很陌生 因此,我创建了两个sql查询,并将它们与kampid绑定在一起,作为两个查询的结果 所有东西都在同一张桌子上,而不是在不同的地方,所以我知道我不能从MYSQL PHP创建嵌套JSON时只得到一个结果,php,mysql,json,nested,Php,Mysql,Json,Nested,我对mysql和php都很陌生 因此,我创建了两个sql查询,并将它们与kampid绑定在一起,作为两个查询的结果 所有东西都在同一张桌子上,而不是在不同的地方,所以我知道我不能 $array1 = array(); $array2 = array(); $sql = "select r.kampid, q.trade from ( select kampid from
$array1 = array();
$array2 = array();
$sql = "select r.kampid, q.trade from (
select kampid
from posts where kampid != 0
group by kampid
) r
join
(
select p.kampid, p.trade
from
(
select kampid, trade, count(*) as cnt
from posts
group by kampid, trade
) p
join
(
select kampid, max(cnt) as maxcnt
from (
select kampid, trade, count(*) as cnt
from posts
group by kampid, trade) x
group by kampid) y
on y.kampid = p.kampid and y.maxcnt = p.cnt
) q
on r.kampid = q.kampid";
//prepare statement
$statement = $this->conn->prepare($sql);
//catch error
if (!$statement){
throw new Exception($statement->error);
}
$statement->execute();
//result we got in execution
$result = $statement->get_result();
// each line append to array new row one by one when it is found
while ($row = $result->fetch_assoc()){
// $array1[$row["kampid"]][] = array( $row['trade'] );
$array1['kampid'] = $row['kampid'];
$array1['trade'] = array($row['trade']);
$array1['department'] = array();
$sql2 = "SELECT COUNT(posts.companyName) AS companies,
posts.kampid, posts.department, SUM(posts.people)AS total
FROM posts WHERE kampid = '".$row['kampid']."' GROUP BY posts.department, posts.kampid ORDER BY posts.kampid, posts.department ASC";
//prepare statement
$statement = $this->conn->prepare($sql2);
//catch error
if (!$statement){
throw new Exception($statement->error);
}
$statement->execute();
//result we got in execution
$result = $statement->get_result();
while ($row2 = $result->fetch_assoc()){
$array2['department'] = $row2['department'];
$array2['companies'] = $row2['companies'];
$array2['total'] = $row2['total'];
array_push($array1[department], $array2);
}
}
$output_arr = array();
array_push($output_arr, $array1);
$jsonData = json_encode($output_arr, JSON_PRETTY_PRINT);
echo $jsonData;
}
我得到这个输出:
[
{
"kampid": 1901,
"trade": [
"Åkeri"
],
"department": [
{
"department": 3,
"companies": 8,
"total": 63
},
{
"department": 4,
"companies": 38,
"total": 114
}
]
}
]
但是json在第一个“kampid”之后停止,这时有更多的“kampid”1902、1903等
我想要的结果如下:
[
{
"kampid": 1901,
"trade": [
"Truck"
],
"department": [
{
"department": 3,
"companies": 8,
"total": 63
},
{
"department": 4,
"companies": 38,
"total": 114
}
]
},
{
"kampid": 1902,
"trade": [
"Mechanic"
],
"department": [
{
"department": 3,
"companies": 8,
"total": 63
},
{
"department": 4,
"companies": 38,
"total": 114
}
]
},
{
"kampid": 1903,
"trade": [
""
],
"department": [
{
"department": 3,
"companies": 8,
"total": 63
},
{
"department": 4,
"companies": 38,
"total": 114
}
]
}
]
有人能指出我做错了什么吗
编辑:获得了将“array_push($output_arr,$array1);”移动到外部循环中的答案,但对于合成结果,我需要重命名第二个$result和$statement这是否回答了您的问题?您对$output_arr的推进来得太晚了,您只是在这两个循环之后才这样做,而这应该发生在外循环内部。(作为一个空数组的初始化当然要先于整个过程。)对于MySQL新手来说,这也是一个令人印象深刻的复杂查询——你能描述一下它的最终目标是什么吗?可能有一个比当前查询更简单的方法。@misorude给出了问题的解决方案。除此之外,此代码对MySQL的查询调用太多,可能导致脚本执行中断。考虑优化代码。可以将代码的特定部分封装到各个函数中。这样更容易跟踪他们的工作。例如,
getAllKamps()
,getcompanyesforkamp($kampid)
,等等。我没有很好地理解您的代码,如果这些函数名是错误的,那么很抱歉。