MySQL单查询中如何获取同表两条记录数据?附问题场景
问题解决:单查询实现文章+评论(含回复)的JSON Feed
原查询的核心问题
- 评论自关联的JOIN条件错误:原语句用
cm.id = c.id关联自身,无法获取被回复的原评论,应改为cm.id = c.commentid - 字段引用错误:Comments表没有
comment字段,需改为c.text - 跨分支引用表别名:第二个UNION分支中使用了第一个分支的
a表别名,导致语法错误 - 无效语法:MySQL中表示空值用
NULL而非nil - 多余的
GROUP BY:itemid是主键,无需分组
修正后的完整SQL
-- 查询所有文章数据 SELECT a.id AS 'itemid', a.text AS 'body', a.pic AS 'itempic', u.name AS 'authorname', u.pic AS 'authorpic', NULL AS 'subtext' FROM Articles `a` LEFT JOIN Users `u` ON a.authorid = u.id UNION ALL -- 查询所有评论(含回复评论) SELECT c.id AS 'itemid', c.text AS 'body', NULL AS 'itempic', u.name AS 'authorname', u.pic AS 'authorpic', cm.text AS 'subtext' FROM Comments `c` -- 关联被回复的原评论,无回复时subtext为NULL LEFT JOIN Comments `cm` ON cm.id = c.commentid LEFT JOIN Users `u` ON c.userid = u.id
逻辑说明
- 文章数据:直接关联Users表获取作者信息,
subtext固定为NULL(无回复对象) - 评论数据:
- 直接评论文章的记录:
c.commentid为NULL,subtext自动为NULL - 回复评论的记录:通过
c.commentid关联原评论,获取原评论内容作为subtext
- 直接评论文章的记录:
- 使用
UNION ALL替代UNION:文章ID与评论ID分属不同表,不会重复,避免不必要的去重操作,提升查询效率
内容的提问来源于stack exchange,提问作者user6631314
相关产品推荐
相关产品推荐

