dsqa6272 2014-08-09 18:16 采纳率: 0%
浏览 56
已采纳

在PHP中使用嵌套查询生成JSON对象

I'm trying to pass JSON Object from PHP like this:

[{
    "id":"user1",
    "shops": [{
        "id":"shop1",
        "invoices": [{
            "id":"invoice1",
            "details": [{
                "id":"detailA"
            }, {
                "id":"detailB"
            }]
        }, {
        "id":"shop2",
        "invoices": [{
            "id":"invoice2",
            "details": [{
                "id":"detailC"
            }, {
                "id":"detailD"
            }]
        }]
    }]
}]

I have this function and it's working, but when database returns a lot of records I get memory limit exhausted. I don't want to increase memory limit. What is the best practice?

function loadusers() {
    $return = array();

    $query = "SELECT u.id FROM users u";
    $users = mysql_query($query);

    while($user = mysql_fetch_assoc($users)) {
        $query = "SELECT s.id FROM shops s WHERE s.id_user = ".$user['id'];
        $shops = mysql_query($query);

        while($shop = mysql_fetch_assoc($shops)) {                
            $query = "SELECT i.id FROM invoices i WHERE i.id_shop = ".$shop['id'];
            $invoices = mysql_query($query);

            while($invoice = mysql_fetch_assoc($invoices)) {                
                $query = "SELECT d.id FROM invoice_details d WHERE d.id_inv = ".$invoice['id'];
                $details = mysql_query($query);

                while($detail = mysql_fetch_assoc($details)) {                
                    $invoices['details'][] = $detail;
                }

                $shop['invoices'][] = $invoice;
            }

            $user['shops'][] = $shop;
        }

        $return[] = $user;
    }

    return $return;
}

Thanks in advance.

Following fiction's answer:

I created new query:

SELECT
    u.id as id_user, 
    s.id as id_shop,
    i.id as id_invoice,
    d.id as id_detail
FROM 
    users u LEFT JOIN shops s ON s.id_user = u.id
    LEFT JOIN invoices i ON i.id_shop = s.id
    LEFT JOIN invoice_details d ON d.id_invoice = i.id

Result:

Query result

Is there a syntax sugar to convert it to expected JSON object like above or do I have to manually parsing the result into PHP array then do the json_encode?

  • 写回答

1条回答 默认 最新

  • douyan2970 2014-08-09 18:29
    关注

    You can do it with one query using JOINS and you will not be needed cycles, query for your situation:

    SELECT 
        users.id as uid, 
        shops.id as sid,
        invoices.id as iid,
        invoice_details.id as did
    FROM 
        users INNER JOIN shops ON shops.id_user = users.id,
        invoices INNER JOIN shops ON invoices.id_shop = shops.is,
        invoice_details INNER JOIN invoices ON invoice_details.id_inv = invoices.id;
    

    Maybe it will be better for you to use another join (not inner), depending on what you want, so some more about joins: http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么