如何通过相同user_id关联3张表获取数据?求更优SQL查询方案
当然有更优的解决方案!你现在的方式需要三次独立查询,不仅增加了数据库的连接开销,代码里还要处理多份结果集,合并成一个SQL语句就能一次性拿到所有需要的数据,效率和代码简洁性都能提升不少。
因为不确定你说的「总点赞数」是指用户收到的点赞数(他的帖子被多少人点赞)还是用户自己点赞的帖子数量,我给你两种对应的方案:
情况1:总点赞数是用户收到的点赞(他的帖子被点赞的总次数)
如果你的LikePost表中likesPostId关联的是Post表的postContent(虽然通常建议用主键关联,比如给Post加个post_id字段会更合理,但先按你现有的表结构来),可以用LEFT JOIN结合GROUP BY实现:
SELECT ui.user_id, ui.userName, COUNT(DISTINCT p.postContent) AS post_count, -- 用DISTINCT避免JOIN后重复计数 COUNT(lp.likesPostId) AS like_count -- 统计用户所有帖子被点赞的总次数 FROM UserInfo ui LEFT JOIN Post p ON ui.user_id = p.user_id LEFT JOIN LikePost lp ON p.postContent = lp.likesPostId WHERE ui.user_id = '123' GROUP BY ui.user_id, ui.userName;
情况2:总点赞数是用户自己点赞的帖子数量
如果是统计该用户给其他帖子点赞的次数,查询会更简单:
SELECT ui.user_id, ui.userName, COUNT(p.postContent) AS post_count, COUNT(lp.likesPostId) AS like_count FROM UserInfo ui LEFT JOIN Post p ON ui.user_id = p.user_id LEFT JOIN LikePost lp ON ui.user_id = lp.user_id WHERE ui.user_id = '123' GROUP BY ui.user_id, ui.userName;
为什么这个方案更好?
- 减少数据库交互次数:原来的三次查询需要三次和数据库建立连接、执行SQL、返回结果,合并后只需要一次,大大降低了网络往返的开销,在高并发场景下性能提升明显。
- 结果集更完整:用
LEFT JOIN即使用户没有发布过帖子或者没有点过赞,对应的post_count和like_count会返回0,而不是空值,避免了代码里还要处理空值的情况。 - 代码逻辑更简洁:只需要处理一份结果集,不需要在代码里拼接多个查询的结果。
额外提个小建议:你的LikePost表用postContent作为关联字段不太合理,因为帖子内容可能会重复或者修改,建议给Post表加一个自增的post_id主键,然后LikePost表用post_id来关联,这样数据一致性和查询效率都会更高。
内容的提问来源于stack exchange,提问作者KevinVuD
相关产品推荐
相关产品推荐

