为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕工程0101907 2022-12-23 13:16:30
我在将多个 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这是一个基于 CodeIgniter 构建的应用程序。
查看完整描述

2 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

您还没有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']

                                   )

                    );


查看完整回答
反对 回复 2022-12-23
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我参加聚会迟到了,但这很重要……


关于您的错误,您似乎忘记了像在循环之前所做的那样在循环中声明结果集$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 members

FROM cc_class_room

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


查看完整回答
反对 回复 2022-12-23
  • 2 回答
  • 0 关注
  • 165 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号