2010-05-25 3 views
1

나는 모든 것이 저장되어있는 주석 테이블을 가지고 있으며 모든 것을 SUM으로 계산하고 BEST ANSWER * 10을 추가해야합니다. 전체 목록의 순위와 지정된 사용자/ID의 순위 표시 방법이 필요합니다. 여기 SUM에 따라 순위를 얻는 방법은 무엇입니까?

는 SQL이다 :

SELECT m.member_id AS member_id, 
      (SUM(c.vote_value) + SUM(c.best)*10) AS total 
    FROM comments c 
    LEFT JOIN members m ON c.author_id = m.member_id 
    GROUP BY c.author_id 
    ORDER BY total DESC 
    LIMIT {$sql_start}, 20 
+1

저는 이해가 안됩니다. 쿼리가 정상적으로 보입니다. 어쩌면 샘플 데이터와 예상 출력이 도움이 될까요? –

+0

순위, 순위 표시 방법 및 지정된 UID – Kenan

답변

0

어떻게 이런 일에 대해 :

SET @rank=0; 
SELECT * FROM (
    SELECT @rank:[email protected]+1 AS rank, m.member_id AS member_id, 
     (SUM(c.vote_value) + SUM(c.best)*10) AS total 
    FROM comments c 
    LEFT JOIN members m ON c.author_id = m.member_id 
    GROUP BY c.author_id 
    ORDER BY total DESC 
) as sub 
LIMIT {$sql_start}, 20 
+0

사실 SET를 사용할 수 없으며 해당 ExpressionEngine 및 SQL 모듈은 SET @ rank = 0을 허용하지 않습니다. 모든 것이 한 줄에 있어야합니다. ";" – Kenan

+0

그런 경우에는 MySQL에서 어떻게해야할지 모르겠다. 하지만 당신은 한도에서 순위를 얻을 수 있습니다. MySQL 대신 프로그램의 순위를 계산하면됩니다. – Wolph

0

당신은 당신의 MySQL 버전을 지원하는 경우 windowing functions을 체크 아웃 할 수 있습니다 ...

SELECT m.member_id AS member_id, 
      (SUM(c.vote_value) + SUM(c.best)*10) AS total, 
      RANK() OVER (ORDER BY (SUM(c.vote_value) + SUM(c.best)*10)) as ranking 
    FROM comments c 
    LEFT JOIN members m ON c.author_id = m.member_id 
    GROUP BY c.author_id 
    ORDER BY total DESC; 

또 다른 가능성은 다음과 같습니다.

SELECT m.member_id AS member_id, 
      (SUM(c.vote_value) + SUM(c.best)*10) AS total, 
      (SELECT count(distinct <column you want to rank by>) 
      FROM comments c1 
      WHERE c1.author_id = m.member_id) as ranking 
    FROM comments c 
    LEFT JOIN members m ON c.author_id = m.member_id 
    GROUP BY c.author_id 
    ORDER BY total DESC; 

NB :이 문제를 해결하기위한 많은 질문이 있지만 위의 두 기술은 일반적으로 순위를 결정하는 간단한 방법입니다. 위에서 언급 한 내용을 회원님의 정확한 요구 사항에 맞게 변경하고 싶습니다. member_id의 순위를 구성하는 요소가 약간 퍼지기 때문입니다.

0
SELECT 
    @rank:[email protected]+1 as rank, 
    m.member_id AS member_id, 
    (SUM(c.vote_value) + SUM(c.best)*10) AS total 
FROM comments c, 
(SELECT @rank:=0) as init 
LEFT JOIN members m ON c.author_id = m.member_id 
GROUP BY c.author_id 
ORDER BY total DESC 
LIMIT {$sql_start}, 20 

전체적으로 동일한 경우에도 순위는 항상 증가합니다.

관련 문제