SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#51 24.03.2011 21:05:42

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

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

Хм.... у меня что-то работа с if и MIN, MAX не прошла. Попробую Ваш вариант.

Неактивен

 

#52 24.03.2011 21:06:59

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

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

Теперь это выглядит так:
SELECT T.Name, COUNT(r) FROM
(
       SELECT r.Game, Times.name, r FROM
    (
           SELECT m.Game, if(MAX(p)-min(p)=0,-1,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


А есть возможность указать ту команду, у которой 0 побед?

Отредактированно pkhell (24.03.2011 21:09:53)

Неактивен

 

#53 24.03.2011 21:18:31

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

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

Можно. Объединить полученный результат со списком игравших в этот период команд и если нет соответствия, то 0. Но у вас таких команд нет smile

Неактивен

 

#54 24.03.2011 21:19:12

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

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

Все бы ничего, но мне надо как-то вывести и команду, которая имеет 0 побед. ((

Неактивен

 

#55 24.03.2011 21:21:48

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

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

Вы не много промахнулись с учетом времени. Там где у вас
FROM Bout join Participant
вместо Bout нужно Bout объединить с games и учесть период в три месяца.

Ну, и если хотите одним запросом, то избавляйтесь от times везде smile

Неактивен

 

#56 24.03.2011 21:23:50

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

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

Не понимаю суть последнего вашего изложения.

Неактивен

 

#57 24.03.2011 21:27:22

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

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

pkhell написал:

Я же сделал уже одним запросом, разве не видели?

Видел, но в итоговом запросе осталось упоминание таблицы times

pkhell написал:

Не понимаю суть последнего вашего изложения.

О том что не везде избавились от times или что не в том месте учитываете дату?

Неактивен

 

#58 24.03.2011 21:29:12

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

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

Я уже заметил проблему. Попробую исправить.

Неактивен

 

#59 24.03.2011 21:34:29

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

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

pkhell написал:

Все бы ничего, но мне надо как-то вывести и команду, которая имеет 0 побед. ((

В предыдущем посте №53 я ответил как это сделать. Измените дату, чтобы в указанный период была команда не имевшая ни одной победы и отлаживайте запрос.
При текущих данных за три указанных месяца каждая команда имеет хотя бы одну победу.

Неактивен

 

#60 24.03.2011 21:36:50

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

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

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

Отредактированно pkhell (24.03.2011 21:38:03)

Неактивен

 

#61 24.03.2011 21:41:27

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

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

Это которая? И что показывает

SELECT Game, Name, SUM(Point) AS p FROM Bout join Participant USING(Participant) GROUP BY 1,2;

Неактивен

 

#62 24.03.2011 21:43:16

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

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

Альянс по очкам не выиграла ни одной игры. Данный запрос разбивает на общую сумму каждой команды в каждой игре. Или вы не об этом?

Отредактированно pkhell (24.03.2011 21:44:32)

Неактивен

 

#63 24.03.2011 21:49:10

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

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

Я просил вас привести результат выполнения этого запроса, чтобы вместе могли увидеть, что в игре "баталион" от 9 марта "альянс" набрал 17 очков, а "орда" 13. Из чего следует, что "альянс" выиграл smile

Неактивен

 

#64 24.03.2011 21:51:48

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

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

pkhell написал:

И я все не пойму, на что заменить Times? Она ведь так удачно собрана, но избавиться от нее надо.

На тот запрос, который её формировал, т.е.

SELECT Game, Name, SUM(Point) AS p FROM Bout join Participant USING(Participant) GROUP BY 1,2;


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

Неактивен

 

#65 24.03.2011 21:52:38

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

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

Я забыл, что переправил таблице немного. В ней он не побеждает. ))
http://img12.imageshost.ru/img/2011/03/24/image_4d8b93c8935a6.jpg

Отредактированно pkhell (24.03.2011 21:53:47)

Неактивен

 

#66 24.03.2011 21:54:52

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

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

pkhell написал:

Я забыл, что переправил таблице немного. В ней он не побеждает. ))

Править исходные данные или менять временной интервал, не суть принципиально. Решение см пост №53

Неактивен

 

#67 24.03.2011 21:56:18

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

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

Так данный запрос будет входить в подзапрос r, а, значит, не вытащить результат уже. Начинаю сходить с ума....

Неактивен

 

#68 24.03.2011 22:00:50

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

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

Попытался сделать:
SELECT T.Name, COUNT(r) FROM
(
       SELECT r.Game, M.name r FROM
    (
           SELECT m.Game, if(MAX(p)-min(p)=0,-1,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 (SELECT Game, Name, SUM(Point) AS p FROM Bout join Participant USING(Participant)
           GROUP BY 1,2) AS M ON M.Game = r.Game AND M.p = r.r
)
AS T
GROUP BY T.Name
Но такая система не хочет работать.

Неактивен

 

#69 24.03.2011 22:04:10

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

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

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

Неактивен

 

#70 24.03.2011 22:11:03

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

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

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 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 (
           SELECT Game, Name, SUM(Point) AS p FROM Bout join Participant USING(Participant)
           GROUP BY 1,2
        ) x ON x.Game = r.Game AND x.p = r.r
)
AS T
GROUP BY T.Name
;


Только учет даты ещё в нужное место перенести smile

Неактивен

 

#71 24.03.2011 23:04:20

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

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

Что-то пытаюсь я соединить внешним соединением таблицу Games  с Bout и Participant, но не получается.

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

Неактивен

 

#72 24.03.2011 23:17:04

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

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

Попытался собрать следующую конструкцию:
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, B.Name, SUM(Point) AS p FROM Bout AS B  INNER JOIN Participant USING(Participant) right outer join Games ON Games.Name = Bout.Game  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 Game, Name, SUM(Point) AS p FROM Bout join Participant USING(Participant)
           GROUP BY 1,2
        ) x ON x.Game = r.Game AND x.p = r.r
)
AS T
GROUP BY T.Name
Не работает. Ругается на B.Name. Как еще можно связать я не знаю. Остается надеяться только на Вас.

Отредактированно pkhell (24.03.2011 23:41:55)

Неактивен

 

#73 24.03.2011 23:52:11

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

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

Неудивительно, так как в таблице bout нет колонки name.
И ещё обратите внимание, что когда вы указали, что таблица bout имеет алиас b, то в дальнейшем везде нужно писать именно b, а не bout.

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 Game, Name, SUM(Point) AS p FROM Bout join Participant USING(Participant)
           GROUP BY 1,2
        ) x ON x.Game = r.Game AND x.p = r.r
)
AS T
GROUP BY T.Name;

Неактивен

 

#74 24.03.2011 23:56:10

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

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

Что отсутствует Name - это я вроде как понял, а вот с алиасом пролетел. А почему связь указывается именно подобным образом? Имеется в виду, что сначала идет обычное соединение, а потом внутреннее. Почему? Спасибо, что помогли!!!

Отредактированно pkhell (25.03.2011 00:01:16)

Неактивен

 

#75 25.03.2011 00:03:30

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

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

INNER JOIN писали вы, а я написал просто join.
Вообще-то это синонимы, а лишнее слово писать лень smile

Неактивен

 

Board footer

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