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

在PHP中使用嵌套查询生成JSON对象,php,mysql,json,join,nested-loops,Php,Mysql,Json,Join,Nested Loops,我尝试从PHP传递JSON对象,如下所示: [{ "id":"user1", "shops": [{ "id":"shop1", "invoices": [{ "id":"invoice1", "details": [{ "id":"detailA" }, { "id":"detailB"

我尝试从PHP传递JSON对象,如下所示:

[{
    "id":"user1",
    "shops": [{
        "id":"shop1",
        "invoices": [{
            "id":"invoice1",
            "details": [{
                "id":"detailA"
            }, {
                "id":"detailB"
            }]
        }, {
        "id":"shop2",
        "invoices": [{
            "id":"invoice2",
            "details": [{
                "id":"detailC"
            }, {
                "id":"detailD"
            }]
        }]
    }]
}]
我有这个函数,它正在工作,但当数据库返回大量记录时,我的内存限制就耗尽了。我不想增加内存限制。最佳做法是什么

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;
}
提前谢谢

以下是小说的答案:

我创建了新查询:

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
结果:


是否有语法糖将其转换为上述预期的JSON对象,或者我是否必须手动将结果解析为PHP数组,然后执行
JSON\u编码

您可以使用连接进行一次查询,您将不需要循环,查询您的情况:

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;
也许使用另一个联接(而不是内部联接)会更好,这取决于您想要什么,因此有关联接的更多信息:

@Jeaffrey no这不是一步就能获得json的任何方法。您需要先获得一个数组。也不要使用MYSQL\u连接函数。他们是!不赞成!而且非常非常!是的!使用它们太可怕了。对不起,我有帽子。将mysqli函数或PDO类与准备好的语句一起使用(如果您想要漂亮和安全的代码)。