一对多关系查询时如何将多端数据以数组形式整合返回?
方案结论
这个需求既可以通过SQL直接实现,也可以通过PHP处理查询结果实现,两种方案各有适用场景。
方案1:通过SQL直接实现
MySQL 5.7及以上版本支持JSON聚合函数,可以直接返回聚合后的帖子JSON串:
SELECT u.id, u.name, JSON_ARRAYAGG( JSON_OBJECT( 'post_id', p.id, 'title', p.title ) ) AS posts FROM users u INNER JOIN posts p ON u.id = p.user_id WHERE u.id = :id GROUP BY u.id, u.name
查询得到的posts字段是JSON格式字符串,在PHP中用json_decode($row['posts'], true)即可转成关联数组,得到你要的结构。
注意:该方案依赖MySQL的JSON函数,低版本数据库无法使用,且大数量下聚合性能不如PHP处理稳定。
方案2:通过PHP处理查询结果(更推荐)
该方案兼容性最高,不依赖数据库版本,性能可控。你可以继续使用原来的SQL查询,拿到返回的行数据后通过简单遍历重组即可:
// $rows 为你原SQL查询得到的二维数组结果 $formatted = []; foreach ($rows as $item) { $uid = $item['id']; if (!isset($formatted[$uid])) { $formatted[$uid] = [ 'id' => $uid, 'name' => $item['name'], 'posts' => [] ]; } $formatted[$uid]['posts'][] = [ 'post_id' => $item['post_id'], 'title' => $item['title'] ]; } // 重置外层数组键为数字索引,符合你期望的输出结构 $result = array_values($formatted);
日常开发更推荐该方案,排查问题更方便,不需要适配数据库的特殊语法。
内容的提问来源于stack exchange,提问作者user_411
相关产品推荐
相关产品推荐

