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

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

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

Вы не зашли.

#1 24.03.2011 17:10:28

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

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

Здравствуйте. Премного благодарен за то, что помогли с предыдущим, но хотел бы попросить помощи с еще одним. Необходимо определить сколько побед одержала каждая команда в течение трех месяцев. Все это должно делаться на основе следующих таблиц:

CREATE TABLE `Bout` (
  `id` int(11) NOT NULL auto_increment,
  `Game` varchar(255) NOT NULL,
  `Participant` varchar(255) NOT NULL,
  `Point` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=37 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=37 ;

--
-- Дамп данных таблицы `Bout`
--

INSERT INTO `Bout` VALUES (1, 'Весенняя баталия', 'Александров', '10');
INSERT INTO `Bout` VALUES (2, 'Весенняя баталия', 'Махеев', NULL);
INSERT INTO `Bout` VALUES (3, 'Весенняя баталия', 'Донской', '0');
INSERT INTO `Bout` VALUES (4, 'Весенняя баталия', 'Авронин', NULL);
INSERT INTO `Bout` VALUES (5, 'Весенняя баталия', 'Матрешкин', '8');
INSERT INTO `Bout` VALUES (6, 'Весенняя баталия', 'Глыбенков', '4');
INSERT INTO `Bout` VALUES (7, 'Баталион', 'Тратилов', '5');
INSERT INTO `Bout` VALUES (8, 'Баталион', 'Кривошеин', '0');
INSERT INTO `Bout` VALUES (9, 'Баталион', 'Серый', '8');
INSERT INTO `Bout` VALUES (10, 'Баталион', 'Астахов', '5');
INSERT INTO `Bout` VALUES (11, 'Баталион', 'Красилов', '4');
INSERT INTO `Bout` VALUES (12, 'Баталион', 'Ильин', '8');
INSERT INTO `Bout` VALUES (13, 'Мясорубка', 'Александров', NULL);
INSERT INTO `Bout` VALUES (14, 'Мясорубка', 'Махеев', NULL);
INSERT INTO `Bout` VALUES (15, 'Мясорубка', 'Донской', '5');
INSERT INTO `Bout` VALUES (16, 'Мясорубка', 'Тратилов', '5');
INSERT INTO `Bout` VALUES (17, 'Мясорубка', 'Кривошеин', '7');
INSERT INTO `Bout` VALUES (18, 'Мясорубка', 'Серый', '4');
INSERT INTO `Bout` VALUES (19, '23 февраля', 'Авронин', '7');
INSERT INTO `Bout` VALUES (20, '23 февраля', 'Матрешкин', '7');
INSERT INTO `Bout` VALUES (21, '23 февраля', 'Глыбенков', '9');
INSERT INTO `Bout` VALUES (22, '23 февраля', 'Астахов', '10');
INSERT INTO `Bout` VALUES (23, '23 февраля', 'Красилов', '2');
INSERT INTO `Bout` VALUES (24, '23 февраля', 'Ильин', '3');
INSERT INTO `Bout` VALUES (25, '8 марта', 'Александров', '12');
INSERT INTO `Bout` VALUES (26, '8 марта', 'Махеев', '5');
INSERT INTO `Bout` VALUES (27, '8 марта', 'Донской', '7');
INSERT INTO `Bout` VALUES (28, '8 марта', 'Астахов', NULL);
INSERT INTO `Bout` VALUES (29, '8 марта', 'Красилов', NULL);
INSERT INTO `Bout` VALUES (30, '8 марта', 'Ильин', '5');
INSERT INTO `Bout` VALUES (31, '1 апреля', 'Авронин', NULL);
INSERT INTO `Bout` VALUES (32, '1 апреля', 'Матрешкин', '10');
INSERT INTO `Bout` VALUES (33, '1 апреля', 'Глыбенков', '11');
INSERT INTO `Bout` VALUES (34, '1 апреля', 'Тратилов', '5');
INSERT INTO `Bout` VALUES (35, '1 апреля', 'Кривошеин', '6');
INSERT INTO `Bout` VALUES (36, '1 апреля', 'Серый', '10');

CREATE TABLE `Games` (
  `id` int(11) NOT NULL auto_increment,
  `Name` varchar(255) NOT NULL,
  `Date` date NOT NULL,
  `Area` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;

--
-- Дамп данных таблицы `Games`
--

INSERT INTO `Games` VALUES (1, 'Весенняя баталия', '2011-02-12', 'спорт-бар "Кегли"');
INSERT INTO `Games` VALUES (2, 'Баталион', '2011-03-09', 'Спорт-бар ''Мочилово''');
INSERT INTO `Games` VALUES (3, 'Мясорубка', '2011-04-06', 'Стадион ''Ессентуки''');
INSERT INTO `Games` VALUES (4, '23 февраля', '2011-02-23', 'Площадь победы');
INSERT INTO `Games` VALUES (5, '8 марта', '2011-03-08', 'MilaVitsa');
INSERT INTO `Games` VALUES (6, '1 апреля', '2011-04-01', 'Дворец спорта');


CREATE TABLE `Participant` (
  `id` int(11) NOT NULL auto_increment,
  `Name` varchar(255) NOT NULL,
  `Participant` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=13 ;

--
-- Дамп данных таблицы `Participant`
--

INSERT INTO `Participant` VALUES (1, 'Неудержимые', 'Александров');
INSERT INTO `Participant` VALUES (2, 'Неудержимые', 'Махеев');
INSERT INTO `Participant` VALUES (3, 'Неудержимые', 'Донской');
INSERT INTO `Participant` VALUES (4, 'Суворовцы', 'Авронин');
INSERT INTO `Participant` VALUES (5, 'Суворовцы', 'Матрешкин');
INSERT INTO `Participant` VALUES (6, 'Суворовцы', 'Глыбенков');
INSERT INTO `Participant` VALUES (7, 'Орда', 'Тратилов');
INSERT INTO `Participant` VALUES (8, 'Орда', 'Кривошеин');
INSERT INTO `Participant` VALUES (9, 'Орда', 'Серый');
INSERT INTO `Participant` VALUES (10, 'Альянс', 'Астахов');
INSERT INTO `Participant` VALUES (11, 'Альянс', 'Красилов');
INSERT INTO `Participant` VALUES (12, 'Альянс', 'Ильин');

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

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

Неактивен

 

#2 24.03.2011 17:32:38

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

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

pkhell написал:

Как я понял, необходимо посчитать сумму очков всех команд в каждой игре

Это вы уже умеете делать.

pkhell написал:

после чего необходимо определить максимальные результаты в каждой игре

Так просто не получиться. Беря максимум в случае ничьей, вы засчитаете побуду и тем и другим.
Нужно смотреть разницу между максимумом и минимумом. Если равно нулю, то ничья, если нет, то берем максимум.

Одним запросом это вряд ли получиться. Я предложил бы писать короткие осмысленные запросы, занося промежуточные результаты во временную таблицу. create temporary table `вспомогательная таблица` select ...

Неактивен

 

#3 24.03.2011 17:35:10

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

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

А что за временная таблица? Никогда не сталкивался с подобным явлением. Как я понял, за основу можно смело принимать предыдущий запрос с суммированием? Я просто попробовал взять максимум от имеющихся сумм, получалось глупо, да и COUNT выдает всем одно значение.

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

Неактивен

 

#4 24.03.2011 17:42:28

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

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

http://dev.mysql.com/doc/refman/5.1/en/ … table.html

При создании таблицы можно использовать ключевое слово TEMPORARY. Временная таблица видна только в рамках текущего соединения и автоматически удаляется при закрытии соединения. Это означает, что два различных соединения могут использовать имена временных таблиц совпадающих между собой или с именем обычной таблицы. (Обычная таблица не доступна пока не удалена временная с тем же именем).

Неактивен

 

#5 24.03.2011 17:52:41

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

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

Тогда опять же вопрос, какого размера делать временную таблицу? Как определить, сколько значений она должна содержать в себе?

Неактивен

 

#6 24.03.2011 17:58:12

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

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

Не понял, что вы подразумеваете под размером. Кол-во столбцов?
Просто делаете
create temporary table `вспомогательная таблица` select и далее ваш запрос

Будет создана временная таблица, содержащая результаты вашего запроса. Имя её столбцов соответствуют тому, что указано в части перечисления полей запроса select.

Не бойтесь экспериментировать.

Неактивен

 

#7 24.03.2011 18:02:58

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

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

Не боюсь.) Вроде как понял, что надо делать. Попробую. Надеюсь на Вашу дальнейшую помощь.

Неактивен

 

#8 24.03.2011 18:06:16

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

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

Блин, то ли я дурак, то ли PhpMyAdmin меня не понимает. Он ругается благим матом на структуру, которую Вы указали.

Неактивен

 

#9 24.03.2011 18:09:49

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

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

Приводите ваш запрос и ответ пхпадмина или скрин, а то "благий мат" не информативно wink

Неактивен

 

#10 24.03.2011 18:10:03

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

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

Для того, чтобы посчитать сумму я сделал следующее:
create temporary table `Times` (
SELECT Game, Name, SUM(Point) AS p FROM Bout  join Participant USING(Participant)
GROUP BY 1,2
)
Вроде ошибок не выдает, но и дальше что делать, я не знаю. Пытаюсь отправить отдельный запрос на таблицу Times, меня лечиться отправляют.

Неактивен

 

#11 24.03.2011 18:13:11

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

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

В чем проявляется "лечиться отправляют" ?

Неактивен

 

#12 24.03.2011 18:16:10

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

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

В том, что запрос проходит, но никакого результата не выдается на него. Я не понимаю, что мне делать дальше и правильно ли задано начало запроса? Просто я никогда раньше не работал с подобными таблицами. А на счет "Лечиться", ошибка при попытке получить информацию с временной таблицы.

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

Неактивен

 

#13 24.03.2011 18:19:01

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

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

Если вы используете MySQL на локальном компе, то попробуйте консольный клиент, там ответ на запрос есть всегда smile
Или показывайте скан.

Неактивен

 

#14 24.03.2011 18:23:41

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

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

После того как я прописываю
create temporary table `Times` (
SELECT Game, Name, SUM(Point) AS p FROM Bout  join Participant USING(Participant)
GROUP BY 1,2
)

выдается чистое поле. Затем я пытаюсь сделать запрос
SELECT *
FROM Times
для проверки информации в таблице.
Получаю #1146 - Table 'bowlingleague.times' doesn't exist, что значит отсутствие. Что не так, не пойму.

Неактивен

 

#15 24.03.2011 18:28:43

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

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

Видимо пхпадмин каждый раз устанавливает новое соединение, а временная таблица живет в рамках сессии. Выход:
1. Использовать в качестве вспомогательных обычные таблицы (тоже самое только без слова temporary)
2. Использовать консольный клиент mysql.

Неактивен

 

#16 24.03.2011 18:30:01

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

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

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

Неактивен

 

#17 24.03.2011 18:31:41

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

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

Можете описать пример, как воспользовавшись дополнительной таблицей, можно управлять нужной информацией. Кроме PhpMyAdmin ничего использовать нельзя.

Неактивен

 

#18 24.03.2011 18:35:05

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

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

Не понял суть вопроса. Вы пост №15 читали?

Неактивен

 

#19 24.03.2011 18:38:23

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

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

Вроде бы читал. Просто если создавать обычные таблицы, то что за запрос тогда получится? Несколько разных для получения одного результата что ли? Это же всю структуру базы искорежит... Да и как это, хм, должно выглядеть? Я просто не могу врубиться. ((

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

Неактивен

 

#20 24.03.2011 18:42:39

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

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

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

Неактивен

 

#21 24.03.2011 18:45:36

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

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

В том и суть, что у меня не получается написать большой запрос. Я получаю сумму очков каждой команды в каждой игре и заношу это в таблице Times. После этого я пытаюсь вычленить максимумы по именам и играм, которые я получаю, но бредово, то есть очки правильные, но команды не правильные присваиваются:
create  table `Times` (
SELECT Game, Name, SUM(Point) AS p FROM Bout  join Participant USING(Participant)
GROUP BY 1,2
)
После чего
SELECT Game, Name, Max(p) FROM Times
GROUP BY Game
Очки должны быть у команды "Суворовцы", а получаются у "Альянса"!
По результата игра должно получиться:
Суворовцы - 3
Орда - 2
Неудержимые - 1
Альянс - 0.
Но не получается.

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

Неактивен

 

#22 24.03.2011 18:53:40

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

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

Второй запрос у вас неправильный. При группировке нельзя выбирать поля по которым не производится группировка и они не имеют группирующей функции.

У вас одному значению game соответствуют по несколько name и `p`. Из `p` вы выбираете одно значение за счет функции max(), а какое значение name при этом должно быть выбрано? Выбирается произвольное.
Такие запросы запрещены синтаксисом SQL, но MySQL на них не ругается хотя результат вы сами видите.

В такой ситуации сначала выбирают Game, и Max(p). А затем по этим значениям выбирают и нужный name.

Неактивен

 

#23 24.03.2011 19:09:55

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

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

Написал:
SELECT Game, r.Name, MAX( r )
FROM (

SELECT DISTINCT Game, MAX( p ) AS r, Name
FROM Times
GROUP BY p
) AS r
JOIN Participant ON Participant.name = r.Name
GROUP BY Game

Выдает:

1 апреля    Суворовцы    25
23 февраля    Суворовцы    23
8 марта    Неудержимые    24
Баталион    Альянс    17
Весенняя баталия    Суворовцы    19
Мясорубка    Орда    16

Все бы и хорошо, но почему-то в строчке Баталион стоит Альянс, а должна быть Орда! 0_0!!

Неактивен

 

#24 24.03.2011 19:20:39

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

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

1. Какой смысл в слове DISTINCT ?
2. Вы прежнему допускаете ту же ошику - выбираете поле Name без группирующей функции.
3. GROUP BY p ?? Видимо это описка и вы подразумевали game
4. В чем смысл объединения с таблицей Participant? Имя команды у вас и так уже есть в таблице Times.
Объединение нужно проводить с таблицей Times, чтобы по имеющимся Game, MAX( p ) получить name.

Неактивен

 

#25 24.03.2011 19:23:59

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

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

Видимо я действительно тупой. Буду пытаться. Не понимаю:
2. Вы прежнему допускаете ту же ошику - выбираете поле Name без группирующей функции.

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

Неактивен

 

Board footer

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