亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用迭代的 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 關注
  • 132 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號