powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Задача на 1 000 000 $
25 сообщений из 33, страница 1 из 2
Задача на 1 000 000 $
    #34121730
Mr. Sliver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите решить следующую задачу:
дана таблица "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
Задача на 1 000 000 $
    #34121850
Фотография alexmsp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял в чем сложность. Сгруппируй по команде и возьми запись с макс.кол. очков, затем соедини результат с таблицей(Join) и вытяни участников.
...
Рейтинг: 0 / 0
Задача на 1 000 000 $
    #34122571
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Задача на 1 000 000 $
    #34122906
Фотография alexmsp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна2 Автор:
Вот Вам три варианта решения поставленной задачи:

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

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

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

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

Надеюсь, что Вы поняли, о чём я Вам говорю...
...
Рейтинг: 0 / 0
Задача на 1 000 000 $
    #34128467
Фотография alexmsp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна 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
Задача на 1 000 000 $
    #34128506
Фотография alexmsp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Анна
Если раздражаетесь, пожалуйста не отвечайте.
Что означает
having count(1) = 1 ?
...
Рейтинг: 0 / 0
Задача на 1 000 000 $
    #34128699
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна
Очень сомневаюсь... имхо без вложенных здесь не обойтись.
Вот и bubucha на форме MS Access того же мнения.


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

Я не понимаю другого, зачем думать, как сделать без подзапроса, если это коряво и неестественно.
SQL - язык С ПОДЗАПРОСАМИ. Их надо испльзовать.
...
Рейтинг: 0 / 0
Задача на 1 000 000 $
    #34128748
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
SQL - язык С ПОДЗАПРОСАМИ. Их надо испльзовать.
Вероятно, основная причина в том, что MySQL 4.0- -- СУБД без подзапросов. ,)
...
Рейтинг: 0 / 0
Задача на 1 000 000 $
    #34128875
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Задача на 1 000 000 $
    #34128879
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexmsp2 Анна
Если раздражаетесь, пожалуйста не отвечайте.
Что означает
having count(1) = 1 ?Выплоните запрос без HAVING и посмотрите на его результат. Для больше наглядности добавьте в итоговый результирующий набор поле COUNT(1). Думаю Вам станет ясно, зачем оно надо. ;)

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

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

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

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

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

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

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

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

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

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

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


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