从MYSQL PHP创建嵌套JSON时只得到一个结果

从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

我对mysql和php都很陌生

因此,我创建了两个sql查询,并将它们与kampid绑定在一起,作为两个查询的结果

所有东西都在同一张桌子上,而不是在不同的地方,所以我知道我不能



            $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)
,等等。我没有很好地理解您的代码,如果这些函数名是错误的,那么很抱歉。