SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.01.2011 20:37:28

Fenelon
Участник
Зарегистрирован: 07.01.2011
Сообщений: 3

Выбор МАКСИМАЛЬНОЙ записи из СВЯЗАННЫХ таблиц

Есть 2 таблицы - opportunities и managers, связанных по manager_id:

mysql> select * from opportunities;
+----+------------------------------+--------+------------+-----------+--------+
| id | opname                       | amount | manager_id | client_id | optype |
+----+------------------------------+--------+------------+-----------+--------+
|  1 | EMC Documentum for MRSK      |    500 |          5 |         1 |      3 |
|  2 | Enterprise Network for FTS   |    890 |          1 |         2 |      3 |
|  3 | Cisco Routers for UFSIN      |     50 |          3 |         5 |      3 |
|  4 | VMware vSphere for Gazprom   |    640 |          6 |         4 |      2 |
|  5 | Annual support for GM        |    320 |          9 |         6 |      1 |
|  6 | SAP ERP integration for MATI |   4000 |          8 |         3 |      1 |
|  7 | Opp 1                        |    130 |          2 |         4 |      2 |
|  8 | Opp 2                        |    130 |          2 |         4 |      2 |
|  9 | Opp 3                        |   4120 |          2 |         4 |      2 |
| 10 | Another one                  |  44120 |          1 |         4 |      2 |
+----+------------------------------+--------+------------+-----------+--------+
10 rows in set (0.00 sec)

mysql> select * from managers;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | Zimarin   |
|  2 | Dombovsky |
|  3 | Kuzmenko  |
|  4 | Dolgov    |
|  5 | Tolstov   |
|  6 | Popov     |
|  7 | Molchanov |
|  8 | Arhipov   |
|  9 | Krylov    |
| 11 | Moiseenko |
+----+-----------+
10 rows in set (0.00 sec)


Задачка такая: вывести одного менеджера с максимальным количеством возможностей в виде managers.name и количеством связанных с ним opportunities

Т.е. ответ должен быть: Dombovsky | 3

Заранее спасибо всем! Буду очень благодарен за помощь!

Отредактированно Fenelon (07.01.2011 20:42:37)

Неактивен

 

#2 07.01.2011 23:13:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5838

Re: Выбор МАКСИМАЛЬНОЙ записи из СВЯЗАННЫХ таблиц

select m.name, t.c from managers m join
(select manager_id, count(manager_id ) c from opportunities group by manager_id order by c desc limit 1) t on m.id=t.manager_id;

Неактивен

 

#3 08.01.2011 02:40:13

Fenelon
Участник
Зарегистрирован: 07.01.2011
Сообщений: 3

Re: Выбор МАКСИМАЛЬНОЙ записи из СВЯЗАННЫХ таблиц

Большое спасибо! А не могли бы вы вкратце пояснить запрос. Я не имею пока обширного опыта в SQL... Буду очень признателен!

Неактивен

 

#4 08.01.2011 06:09:18

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5838

Re: Выбор МАКСИМАЛЬНОЙ записи из СВЯЗАННЫХ таблиц

Подзапросом (select manager_id, count(manager_id ) c from opportunities group by manager_id order by c desc limit 1) t выбираем одного manager_id, встречающегося наибольшее кол-во раз в таблице opportunities. Полученный результат называем таблицей t и объединяем с таблицей managers для получения имени.

http://dev.mysql.com/doc/refman/5.1/en/select.html
http://dev.mysql.com/doc/refman/5.1/en/join.html

Выполняйте запрос по частям, чтобы наглядно было видно логику работы запроса.

Неактивен

 

#5 11.01.2011 17:08:04

jmadhead
Участник
Зарегистрирован: 11.01.2011
Сообщений: 10

Re: Выбор МАКСИМАЛЬНОЙ записи из СВЯЗАННЫХ таблиц

vasya написал:

select m.name, t.c from managers m join
(select manager_id, count(manager_id ) c from opportunities group by manager_id order by c desc limit 1) t on m.id=t.manager_id;

Не совсем ясно зачем здесь join. Неужели where будет выполняться медленнее?

Неактивен

 

#6 11.01.2011 17:11:13

Fenelon
Участник
Зарегистрирован: 07.01.2011
Сообщений: 3

Re: Выбор МАКСИМАЛЬНОЙ записи из СВЯЗАННЫХ таблиц

Здесь по-моему проще не написать... Как Вы себе представляете запрос с WHERE?
До предложенного варианта, у меня был толстый и некрасивый:

select A.name, count(*) from managers as A, opportunities as B WHERE A.id = B.manager_id GROUP BY A.name
HAVING count(*) = (SELECT MAX(c1) FROM (SELECT A1.name, count(*) as c1 from managers as A1,
opportunities as B1 WHERE A1.id = B1.manager_id GROUP BY A1.name) AS r1);

Отредактированно Fenelon (11.01.2011 17:12:05)

Неактивен

 

#7 01.02.2011 09:34:39

jmadhead
Участник
Зарегистрирован: 11.01.2011
Сообщений: 10

Re: Выбор МАКСИМАЛЬНОЙ записи из СВЯЗАННЫХ таблиц

Здесь по-моему проще не написать... Как Вы себе представляете запрос с WHERE?

Действительно, не заметил, что нужно ещё количество. Может тогда вот так, как вариант. Не берусь говорить об оптимальности, т.к. проверить не на чем. Хотя, наверное, ваш вариант всётаки лучше.

select M.name, count(*)
from  opportunities O
lefy join managers M on M.id = O.manager_id
group by M.manager_id
order by count(*) desc
limit 1

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson