Каким должен быть запрос mysql для достижения показанного результата? - PullRequest
2 голосов
/ 22 января 2010

Скажем, у меня есть две таблицы, подобные этим:

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  |
+-----------------+----------+---------+---------------+    

Каким должен быть выбор? Это может быть очень просто, но сейчас я не понимаю ...

Ответы [ 2 ]

3 голосов
/ 22 января 2010

Редактировать 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)
2 голосов
/ 22 января 2010
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
...