2013-05-11 62 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