MySQL输出JSON数据求助:PHP新手遇关联表JSON输出错误
解决MySQL关联表输出嵌套JSON的问题
嗨,作为MySQL和PHP初学者遇到这个问题太正常啦!我来帮你梳理清楚问题所在,然后给出靠谱的解决方案~
首先,你原来的SQL查询用的是旧的隐式连接语法,虽然能查出数据,但直接把结果转成JSON的话,会得到扁平的重复记录(比如channel 1会和它的每条detail各生成一条独立记录),这肯定不是你想要的「每个频道下包含对应详情列表」的嵌套结构。另外要注意:mysql_*系列函数已经被PHP官方废弃了,存在安全风险,建议换成mysqli_*或者PDO,我下面用mysqli来演示,更贴合你原来的代码习惯。
正确的实现步骤
用规范的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在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
相关产品推荐
相关产品推荐

