2014-09-29 65 views
0

我正在开发一个与facebook集成的应用程序。该应用程序可以作为标签应用程序嵌入到FB页面中。在多个表中按ID分组的Mysql计数记录

使用FB SDK feed的页面将被存储在Feed表中。
页面粉丝可能会喜欢并评论按页面发布的Feed。 用户评论专卖店喜欢在表和用户存储在评论

我想总数(喜欢数+评论数)的每一个用户。

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

表:订阅

| 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 

回答

1

这两个查询是无关的,一个连接是无用的。都使用UNION:

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,因为UNION删除重复,并会造成两个子查询产生相同的计数的边缘情况下,不正确的结果。

+0

+1这是工作 – 2014-09-30 03:28:48

0

获得你想要的简单方法是使用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表是什么。但是,您查询的版本会在不同的表之间创建笛卡尔积。如果您对特定用户有很多活动,那么这对性能会非常不利。

+0

非常感谢您的快速回复。 Feed表格用于过滤最近的帖子。让我试试你的查询 – 2014-09-29 12:22:37

+0

我试过这个查询。我得到空的结果 – 2014-09-30 03:23:39

相关问题