SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#26 24.03.2011 19:28:15

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

Re: Определение победителя по очкам

В подзапросе вы выбираете name, а группировку производите по GROUP BY p.

Неактивен

 

#27 24.03.2011 19:30:59

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

При подобной структуре получается тоже бред:
SELECT r.Game, r.Name, Max(r) FROM
(SELECT Game, MAX(p) AS r, Name FROM Times
GROUP BY Game,Name) AS r JOIN Times ON Times.name = r.Name
GROUP BY Game
С именами путаница получается!

Отредактированно pkhell (24.03.2011 19:34:02)

Неактивен

 

#28 24.03.2011 19:41:40

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

Re: Определение победителя по очкам

Чтобы с именами не было путаницы используйте алиасы.

Запрос почти правильный, только зачем в подзапросе вы делаете группировку по Game и Name? Вы хотите найти max среди команд одной игры, т.е. группировку только по game. Имя при этом вообще не выбирается. А затем зная game и MAX(p) объединяете с times, чтобы получить нужное значение name

Неактивен

 

#29 24.03.2011 19:42:57

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Вы, сударь, мастак потрепать нервы, однако. )) Пробую исправить. Не уходите, пожалуйста. )) Так если не соединяться с Times, не получится вытянуть имя из основного запроса, али я чего-то не понимаю.

Отредактированно pkhell (24.03.2011 19:46:08)

Неактивен

 

#30 24.03.2011 19:45:50

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

Re: Определение победителя по очкам

Я могу сразу написать итоговый вариант, если не хотите сами разобраться.

Неактивен

 

#31 24.03.2011 19:46:47

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Я как раз хочу разобраться. Это гораздо полезнее обычного копипаста. Просто я шуткую так. )

Неактивен

 

#32 24.03.2011 19:50:45

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Так если убрать из подзапроса r. Name, не создать связь. Если убрать из основного запроса, не получим команды, которые нужны в финальном будут.

Неактивен

 

#33 24.03.2011 19:55:10

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

Re: Определение победителя по очкам

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

Неактивен

 

#34 24.03.2011 19:57:29

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Я предполагаю, что связать удобнее будет по Game? Это так?

Неактивен

 

#35 24.03.2011 20:03:01

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

Re: Определение победителя по очкам

Одному значению game в таблице times соответствуют несколько строк. Какое name при этом будет выбрано?
А вот паре game и max(p) в таблице times соответствует единственная строка.

Неактивен

 

#36 24.03.2011 20:07:43

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Как я понял, должно быть так:
SELECT r.Game, Times. name, Max(r) FROM
(SELECT s.Game, MAX(p) as r FROM Times s
GROUP BY s.Game) AS r INNER JOIN Times ON Times.Game = r.Game AND Times.p = r.r
GROUP BY r.Game

Неактивен

 

#37 24.03.2011 20:09:06

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Значения я получил, осталось просуммировать COUNT.

Неактивен

 

#38 24.03.2011 20:11:18

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

Re: Определение победителя по очкам

pkhell написал:

Как я понял, должно быть так:
SELECT r.Game, Times. name, Max(r) FROM
(SELECT s.Game, MAX(p) as r FROM Times s
GROUP BY s.Game) AS r INNER JOIN Times ON Times.Game = r.Game AND Times.p = r.r
GROUP BY r.Game

Почти. Только какой смысл несет группировка (GROUP BY r.Game) во внешнем запросе? И соответственно вместо Max(r) просто r.

Неактивен

 

#39 24.03.2011 20:12:43

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Значит так:
SELECT r.Game, Times.name, r FROM
(SELECT s.Game, MAX(p) as r FROM Times s
GROUP BY s.Game) AS r INNER JOIN Times ON Times.Game = r.Game AND Times.p = r.r
Как дальше поступать?

Неактивен

 

#40 24.03.2011 20:15:05

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Дописал до такого уровня:
SELECT Name, COUNT(r) FROM
(SELECT r.Game, Times.name, r FROM
(SELECT s.Game, MAX(p) as r FROM Times s
GROUP BY s.Game) AS r INNER JOIN Times ON Times.Game = r.Game AND Times.p = r.r) AS T
GROUP BY Name
Получаю нужное количество побед, но вот не получаю 0 у команды, которая ни разу не выиграла. Получается, в предыдущем запросе надо вывести еще и команду без очков, так?

Отредактированно pkhell (24.03.2011 20:17:08)

Неактивен

 

#41 24.03.2011 20:21:04

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

Re: Определение победителя по очкам

Теперь прочитать пост №2 в этой теме о том, что max в случае ничьей не дает нам победителя.
А также учесть, что нигде не учтено условие про 3 месяца.

P.S. Я пока не надолго вас покину.

Неактивен

 

#42 24.03.2011 20:27:43

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Такое дело получилось с датой:
SELECT T.Name, COUNT(r) FROM
(SELECT r.Game, Times.name, r FROM
(SELECT s.Game, MAX(p) as r FROM Times s
GROUP BY s.Game) AS r INNER JOIN Times ON Times.Game = r.Game AND Times.p = r.r) AS T INNER JOIN Games ON Games.Name = T.game WHERE Date BETWEEN '2011/02/01' AND '2011/04/30'
GROUP BY T.Name

Неактивен

 

#43 24.03.2011 20:30:57

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

Re: Определение победителя по очкам

Вы запросы проверяете в пхпадмине? Неужели он ошибку не выдает?

Неактивен

 

#44 24.03.2011 20:35:21

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

http://img12.imageshost.ru/img/2011/03/24/image_4d8b815003c9a.jpg

Неактивен

 

#45 24.03.2011 20:37:04

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Как видите, ошибки нет. А вот как можно сделать действие с ничьей, я не знаю.

Неактивен

 

#46 24.03.2011 20:39:34

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

Re: Определение победителя по очкам

Пардон, это я таблицу games проглядел.

Только по логике имеет смысл таблицу games подключать ранее (на этапе формирования times ). А то получается вы сначала анализируете итоги встреч за 10 лет, а на последнем этапе накладываете ограничение на последние 3 месяца.

Неактивен

 

#47 24.03.2011 20:40:28

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Логично. Ну а что мне делать дальше?

Неактивен

 

#48 24.03.2011 20:55:10

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Не понимаю, как сделать исключения по ничьей. Если Case, то MAX и MIN применять нельзя. Если IF, то тоже никак. В стопоре.

Неактивен

 

#49 24.03.2011 21:02:39

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

Re: Определение победителя по очкам

Почему никак? Вместо максимума смотрите разницу max и min. И если она равна 0, то в качестве максимального кол-ва балов берете -1. Так как в таблице times нет строки где кол-во балов равно отрицательному числу, то данный результат учтен не будет.

if(MAX(p)-min(p)=0,-1,max(p))as r

Неактивен

 

#50 24.03.2011 21:04:15

pkhell
Активист
Зарегистрирован: 23.03.2011
Сообщений: 127

Re: Определение победителя по очкам

Общий, пока что наработанный запрос имеет вид:
SELECT T.Name, COUNT(r) FROM (
SELECT r.Game, Times.name, r FROM (
SELECT m.Game, MAX(p) as r FROM (
SELECT Game, Name, SUM(Point) AS p FROM Bout join Participant USING(Participant)
GROUP BY 1,2) AS M INNER JOIN Games ON Games.Name = M.game WHERE Date BETWEEN '2011/02/01' AND '2011/04/30'
GROUP BY m.Game) AS r INNER JOIN Times ON Times.Game = r.Game AND Times.p = r.r ) AS T
GROUP BY T.Name

Неактивен

 

Board footer

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