【问题标题】:Mysql count records grouped by ID in multiple tablesMysql统计多个表中按ID分组的记录
【发布时间】:2025-11-26 21:25:07
【问题描述】:

我正在开发一个与 facebook 集成的应用程序。此应用程序可以作为标签应用程序嵌入到 FB 页面中。

使用 FB SDK 的页面 Feed 将存储在 Feeds 表中。
页面粉丝可能会喜欢并评论页面发布的提要。 用户的点赞存储在Like表中,用户的cmets存储在Comment表中

我想获取每个用户的总计数(点赞数 + 评论数)。

SQL 小提琴:http://sqlfiddle.com/#!2/ecb37/10/0

表格:Feed

| ID |                         POST_ID |
|----|---------------------------------|
| 56 | 150348635024244_795407097185058 |
| 55 | 150348635024244_795410940518007 |
| 54 | 150348635024244_795414953850939 |
| 53 | 150348635024244_797424133650021 |
| 52 | 150348635024244_797455793646855 |
| 51 | 150348635024244_798997120159389 |
| 50 | 150348635024244_798997946825973 |

表格:喜欢

SELECT user_id, COUNT(*) FROM likes GROUP by user_id

|          USER_ID | LIKECOUNT |
|------------------|-----------|
|  913403225356462 |         4 |
|  150348635024244 |         3 |
|  356139014550882 |         2 |
|  753274941400012 |         2 |
| 1559751687580867 |         1 |

表格:评论

SELECT user_id, COUNT(*) FROM comments GROUP by user_id

|         USER_ID | COMMENTSCOUNT |
|-----------------|---------------|
| 150348635024244 |             2 |
| 356139014550882 |             2 |
| 913403225356462 |             2 |

结果应该是这样的

| POINTS | LIKESCOUNT | COMMENTSCOUNT |         USER_ID |
|--------|------------|---------------|-----------------|
|      6 |          4 |             2 | 913403225356462 |
|      5 |          3 |             2 | 150348635024244 |
|      4 |          2 |             2 | 356139014550882 |
|      2 |          2 |             0 | 753274941400012 |
|      1 |          1 |             0 |1559751687580867 |

我试过这个查询。但是每个用户的计数是错误的

SELECT COUNT(likes.user_id)+COUNT(comments.user_id) as points, likes.user_id FROM `likes` 
LEFT JOIN comments ON likes.user_id = comments.user_id 
LEFT JOIN feeds ON likes.post_id = feeds.post_id 
WHERE likes.post_id LIKE '153548635024244%' 
GROUP BY likes.user_id 
ORDER BY points DESC

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这两个查询是不相关的,连接是没有用的。使用 UNION ALL:

    SELECT user_id, sum(n) from (
        SELECT user_id, COUNT(*) n FROM likes GROUP by user_id
        UNION ALL
        SELECT user_id, COUNT(*) FROM comments GROUP by user_id
    ) x
    GROUP BY user_id
    

    需要 UNION ALL 而不仅仅是 UNION,因为 UNION 会删除重复项,并且会导致产生相同计数的两个子查询的边缘情况的错误结果。

    【讨论】:

      【解决方案2】:

      获得所需内容的简单方法是使用count(distinct)。但这可能会有糟糕的表现。相反,使用相关子查询:

      SELECT COUNT(*) +
             (select COUNT(c.user_id) from comments c where c.user_id = l.user_id)
             ) as points, l.user_id
      FROM likes l
      WHERE l.post_id LIKE '153548635024244%' 
      GROUP BY l.user_id 
      ORDER BY points DESC;
      

      我不确定feeds 表的用途。但是,您的查询版本会在不同表之间创建笛卡尔积。如果您对给定用户有很多活动,那将非常不利于性能。

      【讨论】:

      • 非常感谢您的快速回复。提要表用于过滤最近的帖子。让我试试你的查询