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

如何通过相同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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:22:54