2012-07-25 3 views
0

질문에 의해 '고전'MySQL의 맥스/그룹을 가지고있어 여기 내 기본 테이블 구조입니다.Mysql 최대 쿼리 그룹에

id | userid | username | date | score 
1 | 1111 | joe | 2012-05-16 | 1000 
2 | 2222 | john | 2012-03-17 | 2000 
3 | 3333 | jill | 2012-02-11 | 3000 
4 | 2222 | john | 2012-12-25 | 5000 
5 | 3333 | jill | 2012-04-08 | 4000 
6 | 1111 | joe | 2012-06-17 | 1000 
7 | 1111 | joe | 2012-01-14 | 500 
8 | 2222 | john | 2012-06-29 | 6000 
9 | 4444 | bill | 2012-08-08 | 4000 

각 사용자의 최고 점수를 얻고 싶습니다. 각 사용자는 결과에 단 하나의 점수 만 표시해야합니다. 사용자의 가장 높은 점수 번 (예 : ID를 1 & 6) 이상 나타나는 경우

My desired result is 
id | userid | username | date | score 
8 | 2222 | john | 2012-06-29 | 6000 
9 | 4444 | bill | 2012-08-08 | 4000 
5 | 3333 | jill | 2012-04-08 | 4000 
6 | 1111 | joe | 2012-06-17 | 1000 

는, 가장 최근의 날짜가 표시되어야합니다.

이 내 현재 쿼리

id | userid | username | date | score 
8 | 2222 | john | 2012-06-29 | 6000 
9 | 4444 | bill | 2012-08-08 | 4000 
5 | 3333 | jill | 2012-04-08 | 4000 
6 | 1111 | joe | 2012-06-17 | 1000 
1 | 1111 | joe | 2012-05-16 | 1000 

이 문제를 해결하는 방법에 대한 제안의 잘못된 결과를 반환

select s.* 
from scores as s 
inner join (
    select userid, max(score) as max_score 
    from scores 
    group by userid 
    ) t on s.userid = t.userid and s.score = t.max_score 
order by score DESC, date DESC 

입니까?

또한 사용자 ID와 사용자 이름 간의 관계가 일대일 관계가 아니라는 것을 언급해야합니다.

+0

중첩 쿼리를 두 번 사용해야합니다. 이미 한 번 더 중첩 시키십시오. – zerkms

답변

1

이렇게하면 원하는 결과를 얻을 수 있습니다. MySql에는 SQL SERVER와 같은 PARTITION 함수가 없으므로 알려진 작업을 사용했습니다.

SELECT tmp.id, tmp.userid,tmp.username,tmp.`date`,score FROM 
    (SELECT *, IF(@prev<>userid, @rownum := 1, @rownum := @rownum+1) AS rank, 
      @prev := userid 
    FROM scores s0 
    JOIN (SELECT @rownum := NULL, @prev := 0) AS r 
    ORDER BY s0.userid, s0.score DESC, s0.`date` DESC 
    ) AS tmp 
WHERE tmp.rank=1 
ORDER BY tmp.score DESC, tmp.`date` desc 
+0

그럴 수 있습니다. 감사! – clang1234