MySQL查询实现:将答案关联的评论以嵌套列表形式返回
如何查询得到嵌套格式的问题答案与评论?
首先,先明确下你的场景:你有三张关联表(Question、Answer、Comment),想要针对某个问题,返回答案嵌套对应评论的JSON结构,而不是平展的重复数据对吧?
直接给结论:完全可以实现,主要有两种思路——应用层处理(通用所有数据库)和利用数据库的JSON聚合函数(依赖数据库特性,比如MySQL、PostgreSQL都支持)。
先说说你之前的问题
你之前用group by Comment.questionId只会返回单条结果,是因为你按questionId分组了,同一个问题下所有答案和评论会被合并成一组,当然只有一条结果。正确的分组应该是按每个answerId来分,这样才能把每个答案的评论聚合到一起。
方法1:应用层处理(最通用,不依赖数据库特性)
这种方法适合所有关系型数据库,逻辑也简单:
- 先查询指定问题下的所有答案:
SELECT answerId, content AS answerContent FROM Answer WHERE questionId = 1; - 拿到每个
answerId后,再单独查询对应的评论:SELECT commentId, content FROM Comment WHERE answerId = [这里填对应的answerId]; - 在你的代码(比如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
相关产品推荐
相关产品推荐

