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

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;

逻辑说明

  1. 子查询(SELECT Post_ID FROM Post_Like WHERE User_ID = 40)先拿到用户40点赞过的所有帖子ID;
  2. 主查询关联这些帖子的全部点赞记录,用COUNT(DISTINCT pl_all.User_ID)统计每个帖子的独立点赞用户数(避免同一用户重复点赞的情况);
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:11:38