2013-05-11 79 views
1

我有一個論壇,我想找到最受歡迎的用戶。最受用戶喜愛的帖子和評論,也是由最多的帖子和評論來定義的。 最喜歡的用戶喜歡(order 1),大多數帖子(order 2)and 最多評論(order 3)是最流行的。同樣的邏輯適用於下一個(第二)最受歡迎的用戶。選擇喜歡,帖子和評論最熱門的用戶

所以我有3個表:

職位表

id  user_id  likes 
1  1   0 
2  1   0 
3  1   0 
4  1   0 
5  1   0 
6  1   1 
7  1   0 
8  2   0 
9  2   2 
10  2   0 
11  2   0 
12  3   0 
13  3   0 
14  4   0 
15  4   10 

意見表

id  user_id  likes 
1  1   0 
2  1   1 
3  1   1 
4  1   0 
5  2   0 
6  2   2 
7  2   1 
8  4   1 
9  4   0 

用戶表

id  name 
1  John 
2  Adam 
3  Maggie 
4  Steve 

喜歡欄包含其他用戶在各自帖子(行)上給出的喜歡。 我想:

SELECT DISTINCT c.id, c.name, 
    SUM(a.likes), SUM(b.likes), (SUM(a.likes) + SUM(b.likes)) as popular, 
    COUNT(a.id) as mostp, COUNT(b.id) as mostc 
    FROM posts as a, comments as b, users as c 
    WHERE a.user_id=b.user_id AND a.user_id=c.id AND b.user_id=c.id 
    GROUP BY a.user_id, b.user_id ORDER BY popular DESC, mostp DESC, mostc DESC 

顯然,這是不行的,因爲如果你測試查詢並讓更多喜歡(和)低於預期。

這裏是實況查詢 http://sqlfiddle.com/#!2/08900/3

+1

把你的數據(或其子集)在[小提琴](http://sqlfiddle.com),所以我們這些沒有獲得MySQL能夠幫助你。 – hd1 2013-05-11 18:33:37

+0

你可以發佈你想要的輸出嗎 – 2013-05-11 18:43:01

+0

所需的輸出結果是從SUM中推算出的結果與表中的結果完全一致。錯誤的產出(如現在)以笛卡爾產品結束。 – Ricardus 2013-05-11 18:54:08

回答

2

的問題與您的查詢是有一個以上的職位和一個以上的評論,導致笛卡爾積,併產生了錯誤的總和的用戶。

下面的查詢(上SQL Fiddle例子)應該工作,因爲子查詢已組由user_id

SELECT 
    u.name, 
    COALESCE(p.likes,0) + COALESCE(c.likes,0) AS likes, 
    COALESCE(p.cnt,0) AS post_count, 
    COALESCE(c.cnt,0) AS comment_count 
FROM users u 
LEFT JOIN (
    SELECT user_id, COUNT(1) AS cnt, SUM(likes) AS likes 
    FROM posts 
    GROUP BY user_id 
) p ON (p.user_id = u.id) 
LEFT JOIN (
    SELECT user_id, COUNT(1) AS cnt, SUM(likes) AS likes 
    FROM comments 
    GROUP BY user_id 
) c ON (c.user_id = u.id) 
ORDER BY likes DESC, post_count DESC, comment_count DESC; 

結果:

| NAME | LIKES | POST_COUNT | COMMENT_COUNT | 
----------------------------------------------- 
| Steve | 11 |   2 |    2 | 
| Adam |  5 |   4 |    3 | 
| John |  3 |   7 |    4 | 
| Maggie |  0 |   2 |    0 | 
+0

工程就像一個魅力!即使將新用戶添加到用戶表中,根本沒有帖子或評論。再次感謝您提供有用的建議:) – Ricardus 2013-05-11 19:16:53

1

這裏是你如何能做到這一點

SELECT 
    u.id, 
    u.name, 
    (l.likes + r.likes) As TotalLikes, 
    IFNULL(posts,0) AS TotalPosts, 
    IFNULL(comments,0) AS TotalComments 
FROM users AS u 
    LEFT JOIN (SELECT 
      user_id, 
      IFNULL(SUM(likes),0) as likes, 
      COUNT(likes) as posts 
     FROM posts 
     GROUP BY user_id) AS l 
    on l.user_id = u.id 
    LEFT JOIN (SELECT 
      user_id, 
      IFNULL(SUM(likes),0) as likes, 
      COUNT(likes) AS comments 
     FROM comments 
     GROUP BY user_id) AS r 
    on r.user_id = u.id 
ORDER BY TotalLikes DESc 

SQL Fiddle Demo

輸出

| ID | NAME | TOTALLIKES | TOTALPOSTS | TOTALCOMMENTS | 
--------------------------------------------------------- 
| 4 | Steve |   11 |   2 |    2 | 
| 2 | Adam |   5 |   4 |    3 | 
| 1 | John |   3 |   7 |    4 | 
| 3 | Maggie |   0 |   2 |    0 | 
+1

您必須爲'l.like'和'r.like'分開'IFNULL',否則只有評論**或**帖子的用戶將獲得'TotalLikes = 0 「即使他們喜歡。 – 2013-05-11 18:58:12