2014-09-29 64 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

相關問題