2010-01-22 1 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

Edit 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