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

MySQL查询实现:将答案关联的评论以嵌套列表形式返回

如何查询得到嵌套格式的问题答案与评论?

首先,先明确下你的场景:你有三张关联表(Question、Answer、Comment),想要针对某个问题,返回答案嵌套对应评论的JSON结构,而不是平展的重复数据对吧?

直接给结论:完全可以实现,主要有两种思路——应用层处理(通用所有数据库)和利用数据库的JSON聚合函数(依赖数据库特性,比如MySQL、PostgreSQL都支持)。

先说说你之前的问题

你之前用group by Comment.questionId只会返回单条结果,是因为你按questionId分组了,同一个问题下所有答案和评论会被合并成一组,当然只有一条结果。正确的分组应该是按每个answerId来分,这样才能把每个答案的评论聚合到一起。


方法1:应用层处理(最通用,不依赖数据库特性)

这种方法适合所有关系型数据库,逻辑也简单:

  1. 先查询指定问题下的所有答案:
    SELECT answerId, content AS answerContent 
    FROM Answer 
    WHERE questionId = 1;
    
  2. 拿到每个answerId后,再单独查询对应的评论:
    SELECT commentId, content 
    FROM Comment 
    WHERE answerId = [这里填对应的answerId];
    
  3. 在你的代码(比如Java、Python、Node.js等)里,把每个答案对应的评论列表嵌套进去,最终组装成你想要的JSON结构。

这种方法的好处是兼容性强,不管用什么数据库都能搞定,逻辑也清晰,容易调试。


方法2:利用数据库的JSON聚合函数(以MySQL为例)

如果你的数据库是MySQL 5.7+(或者PostgreSQL、SQL Server等支持JSON函数的数据库),可以直接用SQL生成嵌套的JSON结构,不用在应用层做太多处理。

针对你的场景,对应的SQL语句如下:

SELECT 
    a.answerId,
    a.content AS answerContent,
    -- 把评论聚合成JSON数组,如果没有评论就返回空数组
    COALESCE(
        JSON_ARRAYAGG(
            JSON_OBJECT(
                'commentId', c.commentId,
                'content', c.content
            )
        ),
        JSON_ARRAY()
    ) AS comments
FROM Answer a
-- 用LEFT JOIN保证没有评论的答案也能被返回
LEFT JOIN Comment c ON a.answerId = c.answerId
WHERE a.questionId = 1
-- 按每个答案的唯一标识分组,确保每个答案对应一条结果
GROUP BY a.answerId, a.content;

执行这条SQL后,返回的结果里comments字段就是嵌套的JSON数组,你可以直接把查询结果转换成JSON格式,就能得到你想要的结构:

[
  {
    "answerId": 1,
    "answerContent": "Testing Answer 1",
    "comments": [
      {"commentId":1,"content":"Testing Comment 1 to Answer 1"},
      {"commentId":2,"content":"Testing Comment 2 to Answer 1"}
    ]
  },
  {
    "answerId": 2,
    "answerContent": "Testing Answer 2",
    "comments": [
      {"commentId":3,"content":"Testing Comment 1 to Answer 2"},
      {"commentId":4,"content":"Testing Comment 2 to Answer 2"}
    ]
  }
]

内容的提问来源于stack exchange,提问作者DRE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:17:38