![]() |
![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
В подзапросе вы выбираете name, а группировку производите по GROUP BY p.
Неактивен
При подобной структуре получается тоже бред:
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)
Неактивен
Чтобы с именами не было путаницы используйте алиасы.
Запрос почти правильный, только зачем в подзапросе вы делаете группировку по Game и Name? Вы хотите найти max среди команд одной игры, т.е. группировку только по game. Имя при этом вообще не выбирается. А затем зная game и MAX(p) объединяете с times, чтобы получить нужное значение name
Неактивен
Вы, сударь, мастак потрепать нервы, однако. )) Пробую исправить. Не уходите, пожалуйста. )) Так если не соединяться с Times, не получится вытянуть имя из основного запроса, али я чего-то не понимаю.
Отредактированно pkhell (24.03.2011 19:46:08)
Неактивен
Я могу сразу написать итоговый вариант, если не хотите сами разобраться.
Неактивен
Я как раз хочу разобраться. Это гораздо полезнее обычного копипаста. Просто я шуткую так. )
Неактивен
Так если убрать из подзапроса r. Name, не создать связь. Если убрать из основного запроса, не получим команды, которые нужны в финальном будут.
Неактивен
А зачем создавать связь именно по name? Вы знаете игру и очки вот по этим параметрам и создаете связь, чтобы получить искомое name.
Неактивен
Я предполагаю, что связать удобнее будет по Game? Это так?
Неактивен
Одному значению game в таблице times соответствуют несколько строк. Какое name при этом будет выбрано?
А вот паре game и max(p) в таблице times соответствует единственная строка.
Неактивен
Как я понял, должно быть так:
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
Неактивен
Значения я получил, осталось просуммировать COUNT.
Неактивен
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.
Неактивен
Значит так:
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
Как дальше поступать?
Неактивен
Дописал до такого уровня:
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)
Неактивен
Теперь прочитать пост №2 в этой теме о том, что max в случае ничьей не дает нам победителя.
А также учесть, что нигде не учтено условие про 3 месяца.
P.S. Я пока не надолго вас покину.
Неактивен
Такое дело получилось с датой:
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
Неактивен
Вы запросы проверяете в пхпадмине? Неужели он ошибку не выдает?
Неактивен
Как видите, ошибки нет. А вот как можно сделать действие с ничьей, я не знаю.
Неактивен
Пардон, это я таблицу games проглядел.
Только по логике имеет смысл таблицу games подключать ранее (на этапе формирования times ). А то получается вы сначала анализируете итоги встреч за 10 лет, а на последнем этапе накладываете ограничение на последние 3 месяца.
Неактивен
Логично. Ну а что мне делать дальше?
Неактивен
Не понимаю, как сделать исключения по ничьей. Если Case, то MAX и MIN применять нельзя. Если IF, то тоже никак. В стопоре.
Неактивен
Почему никак? Вместо максимума смотрите разницу max и min. И если она равна 0, то в качестве максимального кол-ва балов берете -1. Так как в таблице times нет строки где кол-во балов равно отрицательному числу, то данный результат учтен не будет.
if(MAX(p)-min(p)=0,-1,max(p))as r
Неактивен
Общий, пока что наработанный запрос имеет вид:
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
Неактивен