2010-01-22 2 views
2

말은, 나는이 같은 두 개의 테이블이 있습니다표시된 결과를 얻으려면 mysql 쿼리를 어떻게 작성해야합니까?

Table group   Table user 
+----+-----------+ +----+----------+------+----------+ 
| id | groupname | | id | username | rank | group_id | 
+----+-----------+ +----+----------+------+----------+ 
| 1 | Friends | | 1 | Frank | 1 |  1 | 
| 2 | Family | | 2 | Mike  | 3 |  1 | 
+----+-----------+ | 3 | Steve | 2 |  1 | 
        | 4 | Tom  | 1 |  2 | 
        +----+----------+------+----------+ 

을 그리고 난 모든 그룹을 선택하고 각 그룹에 대한 가장 높은 순위 (가장 높은 숫자)를 사용자에게 싶어. 그래서 기본적으로이 결과를 얻고 싶습니다.

+-----------------+----------+---------+---------------+  
| group.groupname | group.id | user.id | user.username | 
+-----------------+----------+---------+---------------+ 
| Friends   |  1 |  2 |   Mike | 
| Family   |  2 |  4 |   Tom | 
+-----------------+----------+---------+---------------+  

어떻게 선택해야합니까? 그것은 어쩌면 매우 간단하지만 내가 지금 그것을받지 못했습니다 ....

+0

그렇지 않으면 사용자 테이블에 간단한 쿼리가 작동 트릭 – acme

답변

2
select g.groupname, u.group_id, u.id as user_id, u.username 
from group g 
inner join (
    select group_id, max(rank) as MaxRank 
    from user 
    group by group_id 
) um on g.id = um.group_id 
inner join user u on um.group_id = u.group_id and um.MaxRank = u.rank 
3

편집 2 :

내 이전의 대답은 잘못은 max() 호출은 결과를 파괴했다. 여기에 올바른 솔루션입니다 :

SELECT g.groupname, g.id AS group_id, u.id AS user_id, u.username 
FROM `user` u 
LEFT JOIN `group` g ON (u.group_id=g.id) 
WHERE u.rank=(
    SELECT MAX(rank) 
    FROM `user` u2 
    WHERE u.group_id=u2.group_id 
) 

WHERE 절에 체크도 더 이해할 수 있어야합니다. 지금까지 감사 - 그룹 이름이 선택됩니다 있도록

mysql> SELECT g.groupname, g.id AS group_id, u.id AS user_id, u.username 
    -> FROM `user` u 
    -> LEFT JOIN `group` g ON (u.group_id=g.id) 
    -> WHERE u.rank=(
    ->  SELECT MAX(rank) 
    ->  FROM `user` u2 
    ->  WHERE u.group_id=u2.group_id 
    ->); 
+-----------+----------+---------+----------+ 
| groupname | group_id | user_id | username | 
+-----------+----------+---------+----------+ 
| Friends |  1 |  2 | Mike  | 
| Family |  2 |  4 | Tom  | 
+-----------+----------+---------+----------+ 
2 rows in set (0.00 sec) 
+0

예를 할 것이다, 그 결과를 편집! 만큼 쉬운 해결책이없는 한, 이것은 나의 마음에 드는 것이다 ;-) – acme

+0

동일한 랭크를 가진 두 사람이 같은 그룹에 있다면이 솔루션으로 여러 행을 얻을 수있다. 순위가 그룹 내에서 고유하면 문제가 발생하지 않습니다. – SorcyCat

관련 문제