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

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

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

Вы не зашли.

#1 23.03.2011 18:01:33

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

Нахождение максимальной разницы между имеющимися очками

Здравствуйте. Имеется БД "Кегельная лига". В ней содержатся таблицы с игроками(Gamer), командами(Team), капитанами команд(Participant), списком игр(Games) и результатами игр(Bout). Согласно заданию необходимо определить встречу, на которой разница между выбитыми кеглями соревнующихся команд (команда по 3 человека, всего 4 команды), максимальна. Как это осуществить, если таблица выглядит следующим образом:
              1    Весенняя баталия    Александров    10
              2    Весенняя баталия    Махеев    5
              3    Весенняя баталия    Донской    0
              4    Весенняя баталия    Авронин    7
              5    Весенняя баталия    Матрешкин    8
              6    Весенняя баталия    Глыбенков    4
              7    Баталион    Тратилов    5
              8    Баталион    Кривошеин    0
              9    Баталион    Серый    8
              10    Баталион    Астахов    5
              11    Баталион    Красилов    4
              12    Баталион    Ильин    8
              13    Мясорубка    Александров    NULL
              14    Мясорубка    Махеев    NULL
              15    Мясорубка    Донской    5
              16    Мясорубка    Тратилов    5
              17    Мясорубка    Кривошеин    7
              18    Мясорубка    Серый    4
              19    23 февраля    Авронин    7
              20    23 февраля    Матрешкин    7
              21    23 февраля    Глыбенков    9
              22    23 февраля    Астахов    10
              23    23 февраля    Красилов    2
              24    23 февраля    Ильин    3
              25    8 марта    Александров    12
              26    8 марта    Махеев    5
              27    8 марта    Донской    7
              28    8 марта    Астахов    NULL
              29    8 марта    Красилов    NULL
              30    8 марта    Ильин    5
где первое - игра(Game), второе - фамилия игрока(Participant), третье - набранные им в данной игре очки(Point).
Как я понял, надо просуммировать результат каждой команды в каждой игре и вычесть из результата команды противника, после чего определить максимум, но как это сделать, я понять не могу. Спасибо, что обратили внимание. Описал, как смог.

Отредактированно pkhell (23.03.2011 18:05:58)

Неактивен

 

#2 23.03.2011 18:32:15

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

Re: Нахождение максимальной разницы между имеющимися очками

Я тоже понять не могу smile, так как вы не представили данных о том кто в какой команде и какие команды между собой играют.

Неактивен

 

#3 23.03.2011 18:43:24

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

Re: Нахождение максимальной разницы между имеющимися очками

Сейчас попробую организовать необходимую информацию. Извините, просто не знаю, что именно надо.
Таблица Gamer

                       1    Андрей    Александров    8-548-789-11-45    Солнечная, дом 25
              2    Юрий             Махеев    8-489-215-55-69    Полярная, дом 79
              3    Сергей    Донской    8-789-548-15-69    Западная, дом 25
              4    Алексей    Авронин    8-159-357-45-98    Западная, дом 78
              5    Алексей    Матрешкин    8-156-354-74-56    Новояровая, дом 77
              6    Анатолий    Глыбенков    8-897-645-12-56    Сельская, дом 132
              7    Максим    Тратилов    8-489-648-12-54    Синяя, дом 88
              8    Василий    Кривошеин    8-582-697-14-35    Панфиловцев, дом 243
              9    Ваня    Серый    8-478-985-45-58    Юрина, дом 82
              10    Андрей    Астахов    8-852-963-78-12    Горная, дом 34
              11    Никита    Красилов    8-587-512-56-98    Гончарная, дом 78
              12    Илья    Ильин    8-456-987-32-56    Гончарная, дом 32
где Name1 - первое поле, Name2 - второе поле, доп.информация, думаю, не важна
Games
                         1  Весенняя баталия    2011-02-12    спорт-бар "Кегли"
              2    Баталион    2011-03-09    Спорт-бар 'Мочилово'
              3    Мясорубка    2011-04-06    Стадион 'Ессентуки'
              4    23 февраля    2011-02-23    Площадь победы
              5    8 марта    2011-03-08    MilaVitsa
              6    1 апреля    2011-04-01    Дворец спорта
Name - Название игры, Data - дата, Area - место встречи
Participant


              1    Неудержимые    Александров
              2    Неудержимые    Махеев
              3    Неудержимые    Донской
              4    Суворовцы    Авронин
              5    Суворовцы    Матрешкин
              6    Суворовцы    Глыбенков
              7    Орда    Тратилов
              8    Орда    Кривошеин
              9    Орда    Серый
              10    Альянс    Астахов
              11    Альянс    Красилов
              12    Альянс    Ильин
Name - Название команды, Participant - Фамилия игрока.
1 Встреча - Весенняя баталия - играет 1 и 2 команда (Неудержимые(1) и Суворовцы(2))
2 Встреча - Баталион - играет 3 и 4 команда (Орда(3) и Альянс(4)) )))
3. Встреча 1 и 3 команды
4 Встреча 2 и 4 команды
5 Встреча  1 и 4 команды
6 Встреча 2 и 3 команды
Дополнение к таблице Bout
Game

              31    1 апреля    Авронин    4
              32    1 апреля    Матрешкин    10
              33    1 апреля    Глыбенков    11
              34    1 апреля    Тратилов    5
              35    1 апреля    Кривошеин    6
              36    1 апреля    Серый    10
Если и здесь криво описал, что не маловероятно, то могу скинуть саму базу, глянете. Работа осуществляется в среде Phpmyadmin.

Неактивен

 

#4 23.03.2011 19:11:46

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

Re: Нахождение максимальной разницы между имеющимися очками

Что-то стало ещё запутанней. Приведите результат show create table `имя таблицы`; для используемых таблиц.

Неактивен

 

#5 23.03.2011 19:57:24

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

Re: Нахождение максимальной разницы между имеющимися очками

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,
  `Number` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=37 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=37 ;

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

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

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, 'Альянс', 'Ильин');

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

Неактивен

 

#6 23.03.2011 20:12:08

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

Re: Нахождение максимальной разницы между имеющимися очками

А зачем вы храните текстовую информацию, там где можно использовать число?
Например, в таблице `Bout` для полей `Game` и `Participant` вместо varchar(255) вы можете использовать mediumint и хранить идентификатор записи из соответствующей таблицы.

Например, результат каждой команды в каждой игре.
select `Game`, `Name`, sum(`point`) from `Bout`  join `Participant` using(`Participant`) group by 1,2;

http://dev.mysql.com/doc/refman/5.5/en/join.html


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

Неактивен

 

#7 23.03.2011 20:35:06

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

Re: Нахождение максимальной разницы между имеющимися очками

Я бы мог, но суть в том, что нельзя. Какая есть, такую и надо использовать. После описанного Вами запроса, как я понял, осталось вычесть разницу и взять MAX. Попробую. Вот только пока не понимаю, как? Спасибо.

Отредактированно pkhell (23.03.2011 20:43:52)

Неактивен

 

#8 23.03.2011 20:53:45

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

Re: Нахождение максимальной разницы между имеющимися очками

Что-то не толкается на свершение важного действия та серая штука, находящаяся в голове. Пытался вытащить MAX из полученных значений и сделать Count, чтобы получать значения 1 для команд победителей. Не получается. Очень прошу помочь, так как горю.

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

Неактивен

 

#9 23.03.2011 21:15:04

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

Re: Нахождение максимальной разницы между имеющимися очками

select `Game`, max(p)-min(p) from (
select `Game`, `Name`, sum(`point`) p from `Bout`  join `Participant` using(`Participant`) group by 1,2) t
group by 1 order by 2 desc limit 1;

Неактивен

 

#10 23.03.2011 21:44:46

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

Re: Нахождение максимальной разницы между имеющимися очками

Огромнейшее спасибо. Сейчас буду разбираться. Вы, если что, сможете с еще одним помочь? Просто у меня было 10 запросов, 8 я сделал, с одним вы помогли, один еще остался? И еще, Вы случайно не знаете, почему при делении вместо обычной 1, допустим, получается 1.000 и как от этого избавиться?

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

Неактивен

 

#11 23.03.2011 22:46:37

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

Re: Нахождение максимальной разницы между имеющимися очками

Потому, что при делении получается вещественное число. Используйте округление или целочисленное деление.
select 6 div 6;

Неактивен

 

#12 24.03.2011 00:22:34

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

Re: Нахождение максимальной разницы между имеющимися очками

Понял, спасибо. Сейчас пересчитаю.

Неактивен

 

Board footer

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