|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
Помогите решить следующую задачу: дана таблица "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 ------------------------- Сделать это нужно одним запросом с использованием вложенных, если получится без вложенных - флаг в руки. Если будут другие предложения, то я их тоже хочу услышать. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2006, 11:25 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
Не понял в чем сложность. Сгруппируй по команде и возьми запись с макс.кол. очков, затем соедини результат с таблицей(Join) и вытяни участников. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2006, 13:24 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
2 Автор: Вот Вам три варианта решения поставленной задачи: 1) Код: plaintext 1. 2. 3. 4. 5. 6.
2) Код: plaintext 1. 2. 3. 4. 5. 6.
3) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2006, 05:51 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
Щукина Анна2 Автор: Вот Вам три варианта решения поставленной задачи: 2 Анна. Подскажи JETнику, почему во всех вариантах фигурируют две таблицы? Где видно что это одна и таже таблица? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2006, 10:11 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
На самом деле, во всех запросах присутствует ровно одна таблица. Просто она упоминается два раза. Для однозначной идентификации полей на каждое упоминание таблицы в запросе вводится псевдоним (алиас). А в целом - существование двух однотипных объектов с одинаковым именем в пределах одной базы данных (схемы данных) не допускается самим сервером. Поэтому, если в запросе два раза написана таблицы с названием <table_name>, то можно с уверенностью 100% говорить о том, что это одна и та же таблица (случаи с разнорегистровым указанием имени таблиц, заключенных в символы "обратная одинарная кавычка", пока не рассматриваем) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2006, 10:17 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
Кстати, поставленную Вами задачу можно решить и за одно обращение к исходной таблице... Даже в пределах MySQL-ной ветки форума такое решение уже не однажды демонстрировалось... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2006, 10:18 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
Щукина АннаКстати, поставленную Вами задачу можно решить и за одно обращение к исходной таблице... Даже в пределах MySQL-ной ветки форума такое решение уже не однажды демонстрировалось... Очень сомневаюсь... имхо без вложенных здесь не обойтись. Вот и bubucha на форме MS Access того же мнения. http://www.sql.ru/forum/actualthread.aspx?tid=361386 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2006, 20:04 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
alexmsp: вообще-то rtfm. способ описан прямо в документации mysql. разумеется, неоптимальный - но все же он есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2006, 03:39 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
alexmsp Щукина АннаКстати, поставленную Вами задачу можно решить и за одно обращение к исходной таблице... Даже в пределах MySQL-ной ветки форума такое решение уже не однажды демонстрировалось... Очень сомневаюсь... имхо без вложенных здесь не обойтись. Вот и bubucha на форме MS Access того же мнения. http://www.sql.ru/forum/actualthread.aspx?tid=361386Ваше мнение, как и мнение bubucha c форума MS Access, глубоко ошибочно... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2006, 05:43 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
Щукина АннаВаше мнение, как и мнение bubucha c форума MS Access, глубоко ошибочно... @вообще-то rtfm. способ описан прямо в документации mysql. разумеется, неоптимальный - но все же он есть Не хочу вдаваться в спор, но все это голословно, говорить - это одно, сделать - совсем другое. Извините за прямоту. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2006, 09:50 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
alexmspНе хочу вдаваться в спор, но все это голословно, говорить - это одно, сделать - совсем другое. Извините за прямоту.Для особо упрямых, а главное - ленивых: хулиганский вариант от Владимора Конева. Этот вариант элементрано адаптируется под задачу автора этого топика. Надеюсь, хоть ЭТО (адаптацию предложенного варианта под конкретную задачу) Вы удосужитесь сделать самостоятельно. Предвидя Ваши возражения на предмет возможного наличия в таблице полных дублей в пределах команды, которые могут привести к "каше" в результате, сразу отвечу: если такая ситуация допускается, то никто не мешает "разрулить" её, добавив в строковые представления полей записей информацию о уникальном системном идентификаторе строки. В этом случае гарантируется попадание в результат полей именно одной и той же записи, а не их "каша" из записей-дублей. Надеюсь, что Вы поняли, о чём я Вам говорю... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2006, 10:55 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
Щукина Анна 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); ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2006, 19:32 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
2 Анна Если раздражаетесь, пожалуйста не отвечайте. Что означает having count(1) = 1 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2006, 19:59 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
Щукина Анна Очень сомневаюсь... имхо без вложенных здесь не обойтись. Вот и bubucha на форме MS Access того же мнения. Да не, запрос вроде правильный, единственное, что не учитывает он , что может бьть несколько участников с лучшим (одинаковым) результатом. Тогда запрос видимо не выдаст ни одного из них. Я не понимаю другого, зачем думать, как сделать без подзапроса, если это коряво и неестественно. SQL - язык С ПОДЗАПРОСАМИ. Их надо испльзовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2006, 23:00 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
MasterZiv SQL - язык С ПОДЗАПРОСАМИ. Их надо испльзовать. Вероятно, основная причина в том, что MySQL 4.0- -- СУБД без подзапросов. ,) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2006, 23:37 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
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);Если посмотреть внимательно на мой первый ответ в этой теме, то там хорошо видны "простые" пути решения задачи, в том числе и ровно такой, что написали Вы. Усложненный же вариант с "химией" был Вам показан лишь для того, чтобы доказать возможность написания запроса, решающего поставленную задачу, БЕЗ ПОДЗАПРОСОВ. Вы же сами утверждали, что этого сделать нельзя, обвиняли меня в голословности и требовали доказательств моим словам... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2006, 05:16 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
alexmsp2 Анна Если раздражаетесь, пожалуйста не отвечайте. Что означает having count(1) = 1 ?Выплоните запрос без HAVING и посмотрите на его результат. Для больше наглядности добавьте в итоговый результирующий набор поле COUNT(1). Думаю Вам станет ясно, зачем оно надо. ;) HAVING - в общем случае это условия фильтрации на результат работы группировки. То есть, это что-то вроде WHERE. Но если WHERE фильтрует данные, получаемые из таблиц ДО ГРУППИРОВКИ, то HAVING фильтрует уже агрегированные данные, после наложения на них группировки. Другими словами, если бы не было HAVING, то для дополнительной фильтрации данных агрегированного запроса пришлось бы использовать подзапрос. Как вариант - почитать Понимание SQL от Грабера в целом и про предложение HAVING , в частности ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2006, 05:26 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
MasterZivДа не, запрос вроде правильный, единственное, что не учитывает он , что может бьть несколько участников с лучшим (одинаковым) результатом. Тогда запрос видимо не выдаст ни одного из них. Я не понимаю другого, зачем думать, как сделать без подзапроса, если это коряво и неестественно. SQL - язык С ПОДЗАПРОСАМИ. Их надо испльзовать.Ну, если такая ситуация допускается, то можно доработать запрос и на этот случай. Благо, для человека с головой на плечах - это совсем плёвое дело ;) Вам уже сказали ответ на этот вопрос - не все СУБД (или не все версии той или иной СУБД) поддерживают работу с подзапросами. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2006, 05:30 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
решения могут быть ... а может ли быть "1 000 000 $" ? автор явно блефует ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2006, 05:36 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
Щукина Анна alexmsp2 Анна Если раздражаетесь, пожалуйста не отвечайте. Что означает having count(1) = 1 ?Выплоните запрос без HAVING и посмотрите на его результат. Для больше наглядности добавьте в итоговый результирующий набор поле COUNT(1). Думаю Вам станет ясно, зачем оно надо. ;) HAVING - в общем случае это условия фильтрации на результат работы группировки. То есть, это что-то вроде WHERE. Но если WHERE фильтрует данные, получаемые из таблиц ДО ГРУППИРОВКИ, то HAVING фильтрует уже агрегированные данные, после наложения на них группировки. Другими словами, если бы не было HAVING, то для дополнительной фильтрации данных агрегированного запроса пришлось бы использовать подзапрос. Как вариант - почитать Понимание SQL от Грабера в целом и про предложение HAVING , в частности Уходите в сторону, COUNT(1)=1. Аргументом COUNT может быть просто число 1? Или же там нужно укзать имя поля? Или же 1 это индекс поля? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2006, 09:59 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
alexmspУходите в сторону, COUNT(1)=1. Аргументом COUNT может быть просто число 1? Или же там нужно укзать имя поля? Или же 1 это индекс поля?В моём сервере аргументом функции COUNT() может быть в том числе и константа. "1" - лично для меня это просто число (константа), а не индекс поля. Можете указать "*", если Вам так будет привычнее. Просто с детства я привыкла считать все предметы в единицах, а не в звездочках. :) Можете в качестве аргумента функции COUNT() имя какого-нибудь поля указать, помятуя, при этом, об особенностях работы функции COUNT(). В частности, не стОит забывать то, как она обращается с NULL-значениями... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2006, 11:26 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
Щукина Анна alexmspУходите в сторону, COUNT(1)=1. Аргументом COUNT может быть просто число 1? Или же там нужно укзать имя поля? Или же 1 это индекс поля?В моём сервере аргументом функции COUNT() может быть в том числе и константа. "1" - лично для меня это просто число (константа), а не индекс поля. Можете указать "*", если Вам так будет привычнее. Просто с детства я привыкла считать все предметы в единицах, а не в звездочках. :) Можете в качестве аргумента функции COUNT() имя какого-нибудь поля указать, помятуя, при этом, об особенностях работы функции COUNT(). В частности, не стОит забывать то, как она обращается с NULL-значениями... Наконец-то появилось время проверить все ваши варинты. Все действительно работают. Про третий мы уже говорили - он совпал с моим и самый понятный и очевидный. 1ый и 2ой - коррелированные запросы, которые сложны для восприятия и далеко не очевидны. Пришлось сидеть и разбирать все по полкам. У меня вообще такое впечатление что эти варианты придумали либо извращенцы, либо профессионалы в SQL. А вообще спасибо за информацию. Я думаю вообще эту задачу можно вынести в FAQ, потому как в разных вариантах она постояно поднимается на разнх форумах. И Вы, Анна, как постоянный посетитель форума и похоже прфессионально используете SQL - лучший кандидат для этой задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2006, 14:51 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
Щукина Анна alexmspУходите в сторону, COUNT(1)=1. Аргументом COUNT может быть просто число 1? Или же там нужно укзать имя поля? Или же 1 это индекс поля?В моём сервере аргументом функции COUNT() может быть в том числе и константа. "1" - лично для меня это просто число (константа), а не индекс поля. Можете указать "*", если Вам так будет привычнее. Просто с детства я привыкла считать все предметы в единицах, а не в звездочках. :) Можете в качестве аргумента функции COUNT() имя какого-нибудь поля указать, помятуя, при этом, об особенностях работы функции COUNT(). В частности, не стОит забывать то, как она обращается с NULL-значениями... Но я честно говоря так и не понял почему сервер разрешает использование COUNT(1) вместо COUNT(*). COUNT(1) - полная бессмыслица. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2006, 16:26 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
DocAl MasterZiv SQL - язык С ПОДЗАПРОСАМИ. Их надо испльзовать. Вероятно, основная причина в том, что MySQL 4.0- -- СУБД без подзапросов. ,) Это значит это вообще не СУБД. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2006, 18:11 |
|
Задача на 1 000 000 $
|
|||
---|---|---|---|
#18+
alexmsp Но я честно говоря так и не понял почему сервер разрешает использование COUNT(1) вместо COUNT(*). COUNT(1) - полная бессмыслица. Поставьте там COUNT(*), если вам так этого хочется. Это все равно в данном конкретном случае. ( И в любом другом, если все поля NOT NULL и нет OUTER JOIN ). Просто некоторые SQL-программисты любят писать вместо * - 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.11.2006, 18:16 |
|
|
start [/forum/topic.php?fid=47&msg=34128879&tid=1827766]: |
0ms |
get settings: |
4ms |
get forum list: |
6ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
33ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
425ms |
get tp. blocked users: |
1ms |
others: | 6ms |
total: | 481ms |
0 / 0 |