如何使用迭代的 MySQL 查询并形成 json 编码的结果?

我在将多个 SQL 执行到一个数组然后显示为 JSON 数据时遇到问题,这是我的代码:


$sql0="SELECT id,

              company_id,

              class_name

       FROM cc_class_room

       WHERE company_id='CO191125310002'";


$res=$this->db->query($sql0);

$data=$res->result_array();


$i=0;


foreach($data as $row ) {

    $sql1="SELECT COUNT(user_id) member FROM cc_class_room_user WHERE class_id='".$row['company_id']."' GROUP BY class_id";

    $res1=$this->db->query($sql1);


    $responce->rows[$i]['id']=$row['id'];

    $responce->rows[$i]['cell']=array("company_id"=>$row['company_id'],"class_name"=>$row['class_name'],"member"=>$row['member']);

    $i++;

}


return json_encode($responce);

当我这样做时,我得到了一个错误:


未定义索引:成员


第二个 SQL 无法执行,如何在不加入/联合 SQL 的情况下对数组执行 sql?这是我想要的显示 JSON

http://img4.mukewang.com/63a539c800011b4506220467.jpg

这是一个基于 CodeIgniter 构建的应用程序。



慕工程0101907
浏览 166回答 2
2回答

杨__羊羊

您还没有member从第二个查询中获取值。您需要将其提取到不同的数组中,以便将其添加到输出数据中:foreach($data as $row ) {    $sql1="SELECT COUNT(user_id) member FROM cc_class_room_user WHERE class_id='".$row['company_id']."'";    $res1=$this->db->query($sql1);    $row1=$res1->result_array();    $responce->rows[$i]['id']=$row['id'];    $responce->rows[$i]['cell']=array("company_id"=>$row['company_id'],"class_name"=>$row['class_name'],"member"=>$row1[0]['member']);    $i++;}   请注意,您不需要在循环中使用计数器,您可以将所有数据放在一个数组中并将其推送到一行中:$responce[] = array('id' => $row['id'],                    'cell' => array("company_id" => $row['company_id'],                                    "class_name"=>$row['class_name'],                                     "member"=>$row1[0]['member']                                   )                    );

米琪卡哇伊

我参加聚会迟到了,但这很重要……关于您的错误,您似乎忘记了像在循环之前所做的那样在循环中声明结果集$data。$res1=$this->db->query($sql1);  // $res1 is never used again!您可以像这样将计数直接写入您的新数据结构:'member' => $res1->getRowArray['member']当您可以一次完成所有工作时,您不应该重复访问服务器。您可以在 SELECT 子句中使用子查询——这将对表进行与在原始脚本中一样多的单独查询,但这是一次性完成的。这是更好的做法,否则您的老师不应该告诉您。此外,由于您是在 CodeIgniter 中编写应用程序脚本,因此您应该完全接受活动记录语法。如果您的传入company_id值是用户提供的,那么以下代码片段实际上可以帮助您编写稳定、安全且可移植的查询。带有子查询的原始 MySQL SELECT:(db-fiddle.com 演示)SELECT id,       class_name,       (SELECT COUNT(1)        FROM cc_class_room_user        WHERE class_id = company_id) AS membersFROM cc_class_roomWHERE company_id = 'CO191125310002'通过 CodeIgniter 的活动记录使用子查询进行选择:(我已经在本地测试成功/值得信赖)$companyId = 'CO191125310002';$subquery = $this->db    ->select('COUNT(1)')    ->from('cc_class_room_user')    ->where('class_id = company_id')    ->get_compiled_select();$resultSet = $this->db    ->select("id, class_name, ({$subquery}) AS members")    ->from('cc_class_room')    ->where('company_id', $companyId)    ->get()    ->result_array();我还会说可能有更好的替代查询可以执行,但为了完全自信,我需要访问您的表架构才能运行一些测试。无论你选择哪种方式查询数据库,你的结果的准备,IMO,最干净的写法是这样的:$results = [];foreach ($resultSet as $row) {    $results[] = [        'id' => $row['id'],        'cell' => [            'company_id' => $companyId,  // no reason to query for what you already know            'class_name' => $row['class_name'],            'members' => $row['members'],  // I am using plural because it makes better sense for a counted value        ],    ];}return json_encode(['rows' => $results], JSON_PRETTY_PRINT);
打开App,查看更多内容
随时随地看视频慕课网APP