Гость
Map
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Задача на 1 000 000 $ / 25 сообщений из 33, страница 1 из 2
12.11.2006, 11:25
    #34121730
Mr. Sliver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
Помогите решить следующую задачу:
дана таблица "table" в которой содержаться следующие данные - id команды (team_id) - участник команды (member) - очки (score). Нужно выбрать лучшего участника из каждой команды, то есть результат запроса должен содержать все три поля, где участник лучший по очкам и так для каждой команды.

Пожалуйста представьте полный запрос.

Вот таблица - 'table':
team_id | member | score
-------------------------
1 | A | 10
-------------------------
1 | B | 11
-------------------------
1 | C | 12
-------------------------
2 | D | 11
-------------------------
2 | E | 9
-------------------------

В результате запроса хочу получить:

team_id | member | score
-------------------------
1 | C | 12
-------------------------
2 | D | 11
-------------------------

Сделать это нужно одним запросом с использованием вложенных, если получится без вложенных - флаг в руки. Если будут другие предложения, то я их тоже хочу услышать.
...
Рейтинг: 0 / 0
12.11.2006, 13:24
    #34121850
alexmsp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
Не понял в чем сложность. Сгруппируй по команде и возьми запись с макс.кол. очков, затем соедини результат с таблицей(Join) и вытяни участников.
...
Рейтинг: 0 / 0
13.11.2006, 05:51
    #34122571
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
2 Автор:
Вот Вам три варианта решения поставленной задачи:

1)
Код: plaintext
1.
2.
3.
4.
5.
6.
select t1.*
  from table t1
  join table t2
    on t1.team_id = t2.team_id
   and t1.score <= t2.score
 group by t1.team_id, t1.member, t1.score
having count( 1 ) =  1 


2)
Код: plaintext
1.
2.
3.
4.
5.
6.
select t1.*
  from table t1
 where t1.score = (
                    select max(t2.score)
                      from table t2
                     where t1.team_id = t2.team_id
                  )


3)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select t1.*
  from table t1
  join (
         select t2.team_id,
                max(t2.score) as max_score
           from table t2
          group by t2.team_id      
       ) v_t
    on t1.team_id = v_t.team_id
   and t1.score = v_t.max_score 
...
Рейтинг: 0 / 0
13.11.2006, 10:11
    #34122906
alexmsp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
Щукина Анна2 Автор:
Вот Вам три варианта решения поставленной задачи:

2 Анна.
Подскажи JETнику, почему во всех вариантах фигурируют две таблицы?
Где видно что это одна и таже таблица?
...
Рейтинг: 0 / 0
13.11.2006, 10:17
    #34122924
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
На самом деле, во всех запросах присутствует ровно одна таблица. Просто она упоминается два раза. Для однозначной идентификации полей на каждое упоминание таблицы в запросе вводится псевдоним (алиас).
А в целом - существование двух однотипных объектов с одинаковым именем в пределах одной базы данных (схемы данных) не допускается самим сервером. Поэтому, если в запросе два раза написана таблицы с названием <table_name>, то можно с уверенностью 100% говорить о том, что это одна и та же таблица (случаи с разнорегистровым указанием имени таблиц, заключенных в символы "обратная одинарная кавычка", пока не рассматриваем)
...
Рейтинг: 0 / 0
13.11.2006, 10:18
    #34122929
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
Кстати, поставленную Вами задачу можно решить и за одно обращение к исходной таблице...
Даже в пределах MySQL-ной ветки форума такое решение уже не однажды демонстрировалось...
...
Рейтинг: 0 / 0
13.11.2006, 20:04
    #34125141
alexmsp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
Щукина АннаКстати, поставленную Вами задачу можно решить и за одно обращение к исходной таблице...
Даже в пределах MySQL-ной ветки форума такое решение уже не однажды демонстрировалось...
Очень сомневаюсь... имхо без вложенных здесь не обойтись.
Вот и bubucha на форме MS Access того же мнения.
http://www.sql.ru/forum/actualthread.aspx?tid=361386
...
Рейтинг: 0 / 0
14.11.2006, 03:39
    #34125577
@
@
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
alexmsp: вообще-то rtfm.
способ описан прямо в документации mysql.
разумеется, неоптимальный - но все же он есть.
...
Рейтинг: 0 / 0
14.11.2006, 05:43
    #34125608
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
alexmsp Щукина АннаКстати, поставленную Вами задачу можно решить и за одно обращение к исходной таблице...
Даже в пределах MySQL-ной ветки форума такое решение уже не однажды демонстрировалось...
Очень сомневаюсь... имхо без вложенных здесь не обойтись.
Вот и bubucha на форме MS Access того же мнения.
http://www.sql.ru/forum/actualthread.aspx?tid=361386Ваше мнение, как и мнение bubucha c форума MS Access, глубоко ошибочно...
...
Рейтинг: 0 / 0
14.11.2006, 09:50
    #34125843
alexmsp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
Щукина АннаВаше мнение, как и мнение bubucha c форума MS Access, глубоко ошибочно...

@вообще-то rtfm.
способ описан прямо в документации mysql.
разумеется, неоптимальный - но все же он есть

Не хочу вдаваться в спор, но все это голословно,
говорить - это одно, сделать - совсем другое.
Извините за прямоту.
...
Рейтинг: 0 / 0
14.11.2006, 10:55
    #34126130
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
alexmspНе хочу вдаваться в спор, но все это голословно,
говорить - это одно, сделать - совсем другое.
Извините за прямоту.Для особо упрямых, а главное - ленивых: хулиганский вариант от Владимора Конева.
Этот вариант элементрано адаптируется под задачу автора этого топика. Надеюсь, хоть ЭТО (адаптацию предложенного варианта под конкретную задачу) Вы удосужитесь сделать самостоятельно.

Предвидя Ваши возражения на предмет возможного наличия в таблице полных дублей в пределах команды, которые могут привести к "каше" в результате, сразу отвечу: если такая ситуация допускается, то никто не мешает "разрулить" её, добавив в строковые представления полей записей информацию о уникальном системном идентификаторе строки. В этом случае гарантируется попадание в результат полей именно одной и той же записи, а не их "каша" из записей-дублей.

Надеюсь, что Вы поняли, о чём я Вам говорю...
...
Рейтинг: 0 / 0
14.11.2006, 19:32
    #34128467
alexmsp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
Щукина Анна alexmspНе хочу вдаваться в спор, но все это голословно,
говорить - это одно, сделать - совсем другое.
Извините за прямоту.Для особо упрямых, а главное - ленивых: хулиганский вариант от Владимора Конева.
Этот вариант элементрано адаптируется под задачу автора этого топика. Надеюсь, хоть ЭТО (адаптацию предложенного варианта под конкретную задачу) Вы удосужитесь сделать самостоятельно.

Предвидя Ваши возражения на предмет возможного наличия в таблице полных дублей в пределах команды, которые могут привести к "каше" в результате, сразу отвечу: если такая ситуация допускается, то никто не мешает "разрулить" её, добавив в строковые представления полей записей информацию о уникальном системном идентификаторе строки. В этом случае гарантируется попадание в результат полей именно одной и той же записи, а не их "каша" из записей-дублей.

Надеюсь, что Вы поняли, о чём я Вам говорю...

Ну думаю что надо все так усложнять.
Все подрбные задачи решаются очень просто, без всякой "химии":

SELECT T.ID_TEAM, T.ID_MEMBER, T.Score
FROM T INNER JOIN [SELECT T.ID_TEAM, Max(T.Score) AS MSC FROM T GROUP BY T.ID_TEAM]. AS T1 ON (T.Score=T1.MSC) AND (T.ID_TEAM=T1.ID_TEAM);
...
Рейтинг: 0 / 0
14.11.2006, 19:59
    #34128506
alexmsp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
2 Анна
Если раздражаетесь, пожалуйста не отвечайте.
Что означает
having count(1) = 1 ?
...
Рейтинг: 0 / 0
14.11.2006, 23:00
    #34128699
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
Щукина Анна
Очень сомневаюсь... имхо без вложенных здесь не обойтись.
Вот и bubucha на форме MS Access того же мнения.


Да не, запрос вроде правильный, единственное, что не учитывает он , что может бьть несколько участников с лучшим (одинаковым) результатом. Тогда запрос видимо не выдаст ни одного из них.

Я не понимаю другого, зачем думать, как сделать без подзапроса, если это коряво и неестественно.
SQL - язык С ПОДЗАПРОСАМИ. Их надо испльзовать.
...
Рейтинг: 0 / 0
14.11.2006, 23:37
    #34128748
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
MasterZiv
SQL - язык С ПОДЗАПРОСАМИ. Их надо испльзовать.
Вероятно, основная причина в том, что MySQL 4.0- -- СУБД без подзапросов. ,)
...
Рейтинг: 0 / 0
15.11.2006, 05:16
    #34128875
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
alexmspНе думаю, что надо все так усложнять.
Все подрбные задачи решаются очень просто, без всякой "химии":

SELECT T.ID_TEAM, T.ID_MEMBER, T.Score
FROM T INNER JOIN [SELECT T.ID_TEAM, Max(T.Score) AS MSC FROM T GROUP BY T.ID_TEAM]. AS T1 ON (T.Score=T1.MSC) AND (T.ID_TEAM=T1.ID_TEAM);Если посмотреть внимательно на мой первый ответ в этой теме, то там хорошо видны "простые" пути решения задачи, в том числе и ровно такой, что написали Вы.
Усложненный же вариант с "химией" был Вам показан лишь для того, чтобы доказать возможность написания запроса, решающего поставленную задачу, БЕЗ ПОДЗАПРОСОВ.
Вы же сами утверждали, что этого сделать нельзя, обвиняли меня в голословности и требовали доказательств моим словам...
...
Рейтинг: 0 / 0
15.11.2006, 05:26
    #34128879
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
alexmsp2 Анна
Если раздражаетесь, пожалуйста не отвечайте.
Что означает
having count(1) = 1 ?Выплоните запрос без HAVING и посмотрите на его результат. Для больше наглядности добавьте в итоговый результирующий набор поле COUNT(1). Думаю Вам станет ясно, зачем оно надо. ;)

HAVING - в общем случае это условия фильтрации на результат работы группировки. То есть, это что-то вроде WHERE. Но если WHERE фильтрует данные, получаемые из таблиц ДО ГРУППИРОВКИ, то HAVING фильтрует уже агрегированные данные, после наложения на них группировки.
Другими словами, если бы не было HAVING, то для дополнительной фильтрации данных агрегированного запроса пришлось бы использовать подзапрос.
Как вариант - почитать Понимание SQL от Грабера в целом и про предложение HAVING , в частности
...
Рейтинг: 0 / 0
15.11.2006, 05:30
    #34128881
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
MasterZivДа не, запрос вроде правильный, единственное, что не учитывает он , что может бьть несколько участников с лучшим (одинаковым) результатом. Тогда запрос видимо не выдаст ни одного из них.

Я не понимаю другого, зачем думать, как сделать без подзапроса, если это коряво и неестественно.
SQL - язык С ПОДЗАПРОСАМИ. Их надо испльзовать.Ну, если такая ситуация допускается, то можно доработать запрос и на этот случай. Благо, для человека с головой на плечах - это совсем плёвое дело ;)

Вам уже сказали ответ на этот вопрос - не все СУБД (или не все версии той или иной СУБД) поддерживают работу с подзапросами.
...
Рейтинг: 0 / 0
15.11.2006, 05:36
    #34128883
ILL HEAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
решения могут быть ... а может ли быть "1 000 000 $" ?
автор явно блефует
...
Рейтинг: 0 / 0
15.11.2006, 09:59
    #34129175
alexmsp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
Щукина Анна alexmsp2 Анна
Если раздражаетесь, пожалуйста не отвечайте.
Что означает
having count(1) = 1 ?Выплоните запрос без HAVING и посмотрите на его результат. Для больше наглядности добавьте в итоговый результирующий набор поле COUNT(1). Думаю Вам станет ясно, зачем оно надо. ;)

HAVING - в общем случае это условия фильтрации на результат работы группировки. То есть, это что-то вроде WHERE. Но если WHERE фильтрует данные, получаемые из таблиц ДО ГРУППИРОВКИ, то HAVING фильтрует уже агрегированные данные, после наложения на них группировки.
Другими словами, если бы не было HAVING, то для дополнительной фильтрации данных агрегированного запроса пришлось бы использовать подзапрос.
Как вариант - почитать Понимание SQL от Грабера в целом и про предложение HAVING , в частности
Уходите в сторону, COUNT(1)=1. Аргументом COUNT может быть просто число 1? Или же там нужно укзать имя поля? Или же 1 это индекс поля?
...
Рейтинг: 0 / 0
15.11.2006, 11:26
    #34129496
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
alexmspУходите в сторону, COUNT(1)=1. Аргументом COUNT может быть просто число 1? Или же там нужно укзать имя поля? Или же 1 это индекс поля?В моём сервере аргументом функции COUNT() может быть в том числе и константа.
"1" - лично для меня это просто число (константа), а не индекс поля. Можете указать "*", если Вам так будет привычнее.
Просто с детства я привыкла считать все предметы в единицах, а не в звездочках. :)

Можете в качестве аргумента функции COUNT() имя какого-нибудь поля указать, помятуя, при этом, об особенностях работы функции COUNT(). В частности, не стОит забывать то, как она обращается с NULL-значениями...
...
Рейтинг: 0 / 0
15.11.2006, 14:51
    #34130459
alexmsp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
Щукина Анна alexmspУходите в сторону, COUNT(1)=1. Аргументом COUNT может быть просто число 1? Или же там нужно укзать имя поля? Или же 1 это индекс поля?В моём сервере аргументом функции COUNT() может быть в том числе и константа.
"1" - лично для меня это просто число (константа), а не индекс поля. Можете указать "*", если Вам так будет привычнее.
Просто с детства я привыкла считать все предметы в единицах, а не в звездочках. :)

Можете в качестве аргумента функции COUNT() имя какого-нибудь поля указать, помятуя, при этом, об особенностях работы функции COUNT(). В частности, не стОит забывать то, как она обращается с NULL-значениями...
Наконец-то появилось время проверить все ваши варинты. Все действительно работают.
Про третий мы уже говорили - он совпал с моим и самый понятный и очевидный.

1ый и 2ой - коррелированные запросы, которые сложны для восприятия и далеко не очевидны.
Пришлось сидеть и разбирать все по полкам. У меня вообще такое впечатление что эти варианты придумали либо извращенцы, либо профессионалы в SQL.
А вообще спасибо за информацию. Я думаю вообще эту задачу можно вынести в FAQ, потому как в разных вариантах она постояно поднимается на разнх форумах. И Вы, Анна, как постоянный посетитель форума и похоже прфессионально используете SQL - лучший кандидат для этой задачи.
...
Рейтинг: 0 / 0
15.11.2006, 16:26
    #34130872
alexmsp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
Щукина Анна alexmspУходите в сторону, COUNT(1)=1. Аргументом COUNT может быть просто число 1? Или же там нужно укзать имя поля? Или же 1 это индекс поля?В моём сервере аргументом функции COUNT() может быть в том числе и константа.
"1" - лично для меня это просто число (константа), а не индекс поля. Можете указать "*", если Вам так будет привычнее.
Просто с детства я привыкла считать все предметы в единицах, а не в звездочках. :)

Можете в качестве аргумента функции COUNT() имя какого-нибудь поля указать, помятуя, при этом, об особенностях работы функции COUNT(). В частности, не стОит забывать то, как она обращается с NULL-значениями...
Но я честно говоря так и не понял почему сервер разрешает использование COUNT(1) вместо COUNT(*). COUNT(1) - полная бессмыслица.
...
Рейтинг: 0 / 0
15.11.2006, 18:11
    #34131295
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
DocAl MasterZiv
SQL - язык С ПОДЗАПРОСАМИ. Их надо испльзовать.
Вероятно, основная причина в том, что MySQL 4.0- -- СУБД без подзапросов. ,)

Это значит это вообще не СУБД.
...
Рейтинг: 0 / 0
15.11.2006, 18:16
    #34131305
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача на 1 000 000 $
alexmsp
Но я честно говоря так и не понял почему сервер разрешает использование COUNT(1) вместо COUNT(*). COUNT(1) - полная бессмыслица.

Поставьте там COUNT(*), если вам так этого хочется. Это все равно в данном конкретном случае.
( И в любом другом, если все поля NOT NULL и нет OUTER JOIN ).

Просто некоторые SQL-программисты любят писать вместо * - 1.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Задача на 1 000 000 $ / 25 сообщений из 33, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]