You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL输出JSON数据求助:PHP新手遇关联表JSON输出错误

解决MySQL关联表输出嵌套JSON的问题

嗨,作为MySQL和PHP初学者遇到这个问题太正常啦!我来帮你梳理清楚问题所在,然后给出靠谱的解决方案~

首先,你原来的SQL查询用的是旧的隐式连接语法,虽然能查出数据,但直接把结果转成JSON的话,会得到扁平的重复记录(比如channel 1会和它的每条detail各生成一条独立记录),这肯定不是你想要的「每个频道下包含对应详情列表」的嵌套结构。另外要注意:mysql_*系列函数已经被PHP官方废弃了,存在安全风险,建议换成mysqli_*或者PDO,我下面用mysqli来演示,更贴合你原来的代码习惯。

正确的实现步骤

  1. 用规范的JOIN语法查询数据
    先把SQL改成显式JOIN,可读性和维护性更好:

    SELECT c.id AS channel_id, c.name AS channel_name, d.detail
    FROM channel c
    INNER JOIN detail d ON c.id = d.cid
    
  2. 在PHP中整理成嵌套数组
    我们需要把查询到的扁平数据,手动整理成「频道 -> 详情列表」的嵌套结构,再转成JSON:

    // 1. 连接数据库(替换成你的实际数据库信息)
    $conn = mysqli_connect('localhost', '你的用户名', '你的密码', '你的数据库名');
    if (!$conn) {
        die('数据库连接失败: ' . mysqli_connect_error());
    }
    
    // 2. 执行查询
    $query = "SELECT c.id AS channel_id, c.name AS channel_name, d.detail
              FROM channel c
              INNER JOIN detail d ON c.id = d.cid";
    $result = mysqli_query($conn, $query);
    
    // 3. 把扁平数据整理成嵌套数组
    $channels = [];
    while ($row = mysqli_fetch_assoc($result)) {
        $channelId = $row['channel_id'];
        // 如果这个频道还没在数组里,先初始化基础信息
        if (!isset($channels[$channelId])) {
            $channels[$channelId] = [
                'id' => $channelId,
                'name' => $row['channel_name'],
                'details' => []
            ];
        }
        // 把当前详情添加到对应频道的列表中
        $channels[$channelId]['details'][] = $row['detail'];
    }
    
    // 4. 转成JSON(JSON_PRETTY_PRINT让格式更易读)
    $jsonOutput = json_encode(array_values($channels), JSON_PRETTY_PRINT);
    echo $jsonOutput;
    
    // 5. 关闭数据库连接
    mysqli_close($conn);
    

最终输出效果

这样你会得到符合预期的嵌套JSON:

[
    {
        "id": 1,
        "name": "channel 1",
        "details": [
            "detail 1"
        ]
    },
    {
        "id": 2,
        "name": "channel 2",
        "details": [
            "detail 2"
        ]
    }
]

额外小提示

  • 如果有些频道没有对应的详情记录,可以把INNER JOIN改成LEFT JOIN,这样没有详情的频道也会被包含,details字段会显示为空数组。
  • 一定要记得替换代码里的数据库连接信息(用户名、密码、数据库名)。
  • 尽快放弃mysql_*函数,改用mysqli或PDO,它们支持预处理语句,能有效防止SQL注入攻击。

内容的提问来源于stack exchange,提问作者Sinh Vien IT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:52:00