2011-08-17 10 views
2

mysql 쿼리 절에 의해 그룹에 대한 도움이 필요합니다. MySQL : Group by Clause

메달 표

(이 모든 메달을 보유) :

+-----------------------------------------------------------------------+ 
| medal_id | medal_level | medal_name  | medal_type | medal_icon | 
|-----------------------------------------------------------------------| 
|  1 |   1 | 1 post medal |   1 | icon_file.png | 
|  2 |   2 | 1 thread medal |   2 | icon_file.png | 
|  3 |   1 | 2 post medal |   1 | icon_file.png | 
|  4 |   2 | 2 threads medal |   2 | icon_file.png | 
+-----------------------------------------------------------------------+ 

사용자 메달 표 (이것은 사용자가 획득 한 메달을 보유) :

+--------------------------------+ 
|medal_id |user_id | earnedtime | 
|--------------------------------| 
|  1 |  1 | 1313548360 | 
|  2 |  1 | 1313548365 | 
|  3 |  1 | 1313548382 | 
|  4 |  1 | 1313548410 | 
+--------------------------------+ 

을 MySQL 쿼리 :

SELECT m.*, u.* 
FROM users_medals u 
LEFT JOIN medals m ON (u.medal_id=m.medal_id) 
WHERE u.user_id IN(1) 
GROUP BY m.medal_type 
ORDER BY u.earnedtime 

이것은 사용자가 얻은 메달 표시 (이것은 게시판 시스템을위한 플러그인 임)입니다. 사용자 메달 ID가 모든 메달을 보유하고있는 테이블의 메달 ID와 동일한 메달을 선택하여 표시합니다.

하지만 제대로 작동하지만 최신 메달이 표시되지 않습니다. 그것은 3

추가 정보 4.를 표시해야한다 (1), (2) : 나는 각 메달의 종류에서 하나 개의 메달을 표시 할 그것은 단지 다음 메달 아이디의 표시입니다. 예를 들어, 사용자가 두 개의 "포스트 메달"을 얻은 경우 획득 한 다른 메달과 함께 획득 한 최근의 메달 만 표시됩니다.

도움을 주시면 감사하겠습니다.

+2

왜 'GROUP BY'를 사용하고 있습니까? – Dalen

+0

@Dalen 어떻게 든 메달 분류를 그룹화해야하므로 각 유형에 대해 하나의 메달 만 표시합니다. – Spencer

+0

medal_id 1 (유형 1) 및 medal_id 2 (유형 2)를 표시하는 경우. 그런 다음 유형 당 1 개의 메달 만 표시합니다. 그래서 효과가 있습니까? –

답변

1
SELECT m.*, u.* 
    FROM users_medals u 
    LEFT JOIN medals m ON u.medal_id = m.medal_id 
    WHERE u.user_id IN (1) 
    AND u.earnedtime = (
    SELECT MAX(users_medals.earnedtime) FROM users_medals 
    LEFT JOIN medals ON users_medals.medal_id = medals.medal_id 
    WHERE users_medals.user_id = u.user_id 
    AND medals.medal_type = m.medal_type 
) 

나는 너무 추가하다하지만 다른 테이블에 내 머리 아파 만들어지고 메달 유형의 제한으로이 작업을 수행 할 수 있어야한다고 생각합니다. 함께 결합 된 두 테이블의 뷰가 있으면 작성하는 것이 더 쉬울 것입니다.

+0

달콤한! 그것은 완벽하게 작동하는 것 같습니다! 고마워. :) – Spencer

0

"GROUP BY medal_type"이 (가) 있습니다. 메달 표에는이 열의 1,2의 값만 있기 때문에 결과에 3 & 4가 표시되지 않습니다.

+0

내가 원하는 것은 각 메달 유형에서 하나의 메달 만 표시하는 것입니다. 예를 들어, 사용자가 두 개의 "포스트 메달"을 가지고있는 경우 최근에 얻은 것만 표시됩니다. – Spencer

0

메달 종류별로 그룹화했기 때문에 3과 4가 보이지 않습니다. 그래서 3과 4 그리고 1과 2와 같은 유형. 당신이 떨어져서 그룹을 가져 가면 그것은 모든 메달을 보여줄 것입니다. 당신이로이 그룹을 원하지만 당신이 메달 유형별로 그룹화하고 있기 때문에 3과 4는 그런 다음 당신은 단순히

order by m.medal_type descending 
0

필요합니다

, 그것은 단지 각 유형 중 하나를 선택합니다. 사용자가 획득 한 모든 메달의 목록을 보려면 왜 메달 유형별로 그룹화합니까?

아마도 가장 높은 수준의 메달을 유형별로 찾고 계신 것 같습니까? 그렇다면이를 지정하는 것이 좋습니다.

0

Dalen은 올바른 것을 물어 보았습니다. 왜 GROUP BY를 처음 사용 하시겠습니까? 이 쿼리에서는 필요하지 않습니다. GROUP BY는 다른 용도로 사용됩니다. 어쩌면 당신은 this one과 같은 예를 통해 더 많은 것을 이해할 수 있습니다.