簡體   English   中英

MySQL計數記錄按ID在多個表中分組

[英]Mysql count records grouped by ID in multiple tables

我正在開發與Facebook集成的應用程序。 該應用程序可以作為選項卡應用程序嵌入到FB頁面中。

使用FB SDK的頁面的提要將存儲在提要表中。
專頁粉絲可能會對按頁面發布的供稿感興趣並發表評論。 用戶的存儲在“ 贊”表中,用戶的評論存儲在“ 評論”表中

我想獲取每個用戶的總數(喜歡數+評論數)。

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

這兩個查詢是無關的,聯接是無用的。 使用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會刪除重復項,並且對於兩個子查詢產生相同計數的邊緣情況將導致不正確的結果。

獲得所需內容的簡單方法是使用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表的用途。 但是,您使用的查詢版本會在不同表之間創建笛卡爾乘積。 如果給定用戶有很多活動,那將對性能造成很大影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM