SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#76 25.03.2011 00:05:15

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

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

Понятно. Ну, еще раз спасибо. За 6-7 часов общения с Вашей персоной я понял многое. Закрепить осталось.))

Неактивен

 

#77 25.03.2011 00:08:20

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

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

Кстати, возникла еще одна идея: можно ли на основе данного запроса вывести количество поражений команд?

Неактивен

 

#78 25.03.2011 00:12:19

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

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

Допишите вторую часть запроса, чтобы 0 показывал как раз и закрепите smile

Кстати, в той части запроса где
(
           SELECT Game, Name, SUM(Point) AS p FROM Bout join Participant USING(Participant)
           GROUP BY 1,2
        ) x

по хорошему тоже надо учитывать ограничение по времени.
А ещё лучше разбить на несколько простых, потому что когда допишите окончательно это будет такая конструкция...

Неактивен

 

#79 25.03.2011 00:14:50

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

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

pkhell написал:

Кстати, возникла еще одна идея: можно ли на основе данного запроса вывести количество поражений команд?

Да. Заменив два символа smile
Берите min вместо max в случае положительной разницы между ними.

Неактивен

 

#80 25.03.2011 00:15:41

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

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

Хм....а что именно подразумевается под второй частью запроса?)) Хорошо, учту.

Неактивен

 

#81 25.03.2011 00:18:01

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

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

Что еще интересно, в условии IF имеется параметр -1, который, как я понял, отнимает значений, чтобы +1 не засчитывался, но прикол в том, что если я его меняю на любое другое число, разницы не происходит.

Неактивен

 

#82 25.03.2011 00:22:05

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

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

pkhell написал:

Что еще интересно, в условии IF имеется параметр -1, который, как я понял, отнимает значений, чтобы +1 не засчитывался, но прикол в том, что если я его меняю на любое другое число, разницы не происходит.

vasya написал:

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

Неактивен

 

#83 25.03.2011 00:23:09

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

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

pkhell написал:

Хм....а что именно подразумевается под второй частью запроса?))

Чтобы для команды не имевшей ни одной победы показывало 0

Неактивен

 

#84 25.03.2011 12:33:54

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

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

Это получается, что надо через UNION создать дополнительный запрос с учетом данного условия?

Неактивен

 

#85 25.03.2011 13:07:03

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

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

Нет, через left join.
Список команд, игравших в указанный период (за последние три месяца) объединяете с имеющимся результатом и если нет соответствия, то присваиваете 0.

Неактивен

 

#86 25.03.2011 13:18:26

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

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

Вот оно как. Сейчас попробую. Может хоть что-нибудь получится.

Неактивен

 

#87 25.03.2011 14:25:59

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

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

vasya написал:

Нет, через left join.
Список команд, игравших в указанный период (за последние три месяца) объединяете с имеющимся результатом и если нет соответствия, то присваиваете 0.

Как я понял, надо соединять с подзапросом T, ведь он уже подводит итоги существования победных строк, так?

Неактивен

 

#88 25.03.2011 15:18:03

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

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

Во всем запросе мы имеем: подсчет очков, определение максимума и блокировка ничьих, присваивание максимумов командам по играми очкам, по строчкам подсчет побед. Получается, что необходимо определить команду, которая имеет ноль строк, но присутствует в предыдущих наборах. Вот только не пойму, как? Описанная Вами структура не понятна.

Отредактированно pkhell (25.03.2011 15:18:46)

Неактивен

 

#89 25.03.2011 19:12:24

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

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

Многоуважаемый vasya, не могли бы Вы подправить все полученный ранее результаты так, как считаете нужным и выложить финальный результат, так как у меня не получается. Я имею ввиду, добавить колонку проигрышей и последнюю команду с 0 очков. Спасибо.

Неактивен

 

#90 25.03.2011 20:49:42

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

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

select t1.name 'имя команды', ifnull(t2.`count(r)`,0) 'кол-во побед' from
 (         SELECT distinct p.Name
           FROM Bout AS B join Games ON Games.Name = B.Game INNER JOIN Participant p USING(Participant)
           WHERE Date BETWEEN '2011/02/01'   AND '2011/04/30') t1
 left join (SELECT T.Name, COUNT(r) FROM
(
       SELECT r.Game, name, r FROM
    (
           SELECT m.Game, if(MAX(p)-min(p)=0,-1,max(p)) as r FROM
       (
           SELECT B.Game, p.Name, SUM(Point) AS p
           FROM Bout AS B join Games ON Games.Name = B.Game INNER JOIN Participant p USING(Participant)
           WHERE Date BETWEEN '2011/02/01'   AND '2011/04/30'
           GROUP BY 1,2
        )
          AS M
         GROUP BY m.Game
    )
       AS r INNER JOIN (
           SELECT B.Game, p.Name, SUM(Point) AS p
           FROM Bout AS B join Games ON Games.Name = B.Game INNER JOIN Participant p USING(Participant)
           WHERE Date BETWEEN '2011/02/01'   AND '2011/04/30'
           GROUP BY 1,2
        ) x ON x.Game = r.Game AND x.p = r.r
)
AS T
GROUP BY T.Name) t2
 using(name);


Колонку проигрышей считать аналогичным запросом и объединять со списком игравших команд аналогично победам.

select t1.name 'имя команды', ifnull(t2.`count(r)`,0) 'кол-во побед', ifnull(t3.`count(r)`,0) 'кол-во поражений' from
 (         SELECT distinct p.Name
           FROM Bout AS B join Games ON Games.Name = B.Game INNER JOIN Participant p USING(Participant)
           WHERE Date BETWEEN '2011/02/01'   AND '2011/04/30') t1
 left join (SELECT T.Name, COUNT(r) FROM
(
       SELECT r.Game, name, r FROM
    (
           SELECT m.Game, if(MAX(p)-min(p)=0,-1,max(p)) as r FROM
       (
           SELECT B.Game, p.Name, SUM(Point) AS p
           FROM Bout AS B join Games ON Games.Name = B.Game INNER JOIN Participant p USING(Participant)
           WHERE Date BETWEEN '2011/02/01'   AND '2011/04/30'
           GROUP BY 1,2
        )
          AS M
         GROUP BY m.Game
    )
       AS r INNER JOIN (
           SELECT B.Game, p.Name, SUM(Point) AS p
           FROM Bout AS B join Games ON Games.Name = B.Game INNER JOIN Participant p USING(Participant)
           WHERE Date BETWEEN '2011/02/01'   AND '2011/04/30'
           GROUP BY 1,2
        ) x ON x.Game = r.Game AND x.p = r.r
)
AS T
GROUP BY T.Name) t2
 using(name)
left join (SELECT T.Name, COUNT(r) FROM
(
       SELECT r.Game, name, r FROM
    (
           SELECT m.Game, if(MAX(p)-min(p)=0,-1,min(p)) as r FROM
       (
           SELECT B.Game, p.Name, SUM(Point) AS p
           FROM Bout AS B join Games ON Games.Name = B.Game INNER JOIN Participant p USING(Participant)
           WHERE Date BETWEEN '2011/02/01'   AND '2011/04/30'
           GROUP BY 1,2
        )
          AS M
         GROUP BY m.Game
    )
       AS r INNER JOIN (
           SELECT B.Game, p.Name, SUM(Point) AS p
           FROM Bout AS B join Games ON Games.Name = B.Game INNER JOIN Participant p USING(Participant)
           WHERE Date BETWEEN '2011/02/01'   AND '2011/04/30'
           GROUP BY 1,2
        ) x ON x.Game = r.Game AND x.p = r.r
)
AS T
GROUP BY T.Name) t3 using(name)
 ;

Неактивен

 

#91 25.03.2011 20:52:14

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

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

Офигеть! А я думал, что просто необходимо добавить небольшую табличку, вот и все. Спасибо! Ей Богу, огромное Вам спасибо!

Неактивен

 

#92 25.03.2011 21:21:53

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

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

Все, разобрался.))

Неактивен

 

Board footer

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