MySQL按条件分组统计点赞数:统计特定用户点赞过的帖子总点赞数
特定用户点赞帖子的总点赞数统计修正方案
你的原SQL之所以每个帖子计数都是1,核心问题是WHERE pl.User_ID = 40直接过滤掉了其他用户的点赞记录——分组后每个帖子下只剩下用户40自己的那一条点赞数据,统计结果自然只能是1。要实现需求,得先筛选出用户40点赞过的帖子,再统计这些帖子的所有点赞人数,以下是两种可行的修正方案:
方案一:子查询筛选目标帖子
SELECT p.content, COUNT(DISTINCT pl_all.User_ID) AS total_likes_count FROM Post p JOIN Post_Like pl_all ON p.id = pl_all.Post_ID WHERE p.id IN (SELECT Post_ID FROM Post_Like WHERE User_ID = 40) GROUP BY p.id, p.content;
逻辑说明
- 子查询
(SELECT Post_ID FROM Post_Like WHERE User_ID = 40)先拿到用户40点赞过的所有帖子ID; - 主查询关联这些帖子的全部点赞记录,用
COUNT(DISTINCT pl_all.User_ID)统计每个帖子的独立点赞用户数(避免同一用户重复点赞的情况); - GROUP BY包含
p.id(Post表主键)和p.content,确保不同帖子即使内容相同也能正确分组。
方案二:双JOIN筛选统计
SELECT p.content, COUNT(DISTINCT pl_all.User_ID) AS total_likes_count FROM Post p -- 第一步:关联用户40的点赞记录,锁定他点赞过的帖子 JOIN Post_Like pl_target ON p.id = pl_target.Post_ID AND pl_target.User_ID = 40 -- 第二步:关联上述帖子的所有点赞记录 JOIN Post_Like pl_all ON p.id = pl_all.Post_ID GROUP BY p.id, p.content;
逻辑说明
通过两次JOIN完成筛选和统计:第一次JOIN只保留用户40点赞过的帖子,第二次JOIN拉取这些帖子的全部点赞数据,最后统计总点赞人数。
注意事项
- 假设Post表存在主键
id(原SQL中已使用p.id,所以默认该字段存在); - 如果业务逻辑中用户对同一帖子只能点赞一次,
COUNT(DISTINCT ...)可以替换为COUNT(*),但保留DISTINCT会更严谨; - GROUP BY必须包含Post表的主键,否则可能出现分组错误。
内容的提问来源于stack exchange,提问作者tHatpart
相关产品推荐
相关产品推荐

