2013-05-11 2 views
1

나는 포럼이 있으며 가장 인기있는 사용자를 찾고 싶습니다. 가장 인기있는 사용자는 게시물과 댓글에서 가장 좋아하는 것으로 정의되며 가장 많은 게시물과 댓글로 정의됩니다. 이 가장 많이 사용되는 사용자는 (주문 1), 대부분의 게시물 (주문 2) 및 대부분의 댓글 (주문 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 

사용자 테이블

:

그래서 내가 3 개 테이블이

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

+0

원하는 출력을 게시 할 수 있습니까? –

+0

원하는 출력은 SUM에서 외삽 한 결과가 표의 것과 동일합니다. 잘못된 출력 (현재와 같이)은 데카르트 곱으로 끝납니다. – Ricardus

답변

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

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 

,442,

출력

| 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'을 별도로해야합니다. 그렇지 않으면 ** 또는 ** posts 주석 만있는 사용자는'TotalLikes = 0 "그들이 좋아하는 사람이라 할지라도. –

관련 문제