SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#26 04.05.2011 18:03:04

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

Re: 3 непонятных запроса

Итак, я прикрепил новый дамп базы, в которой есть новый корабль Japanez. Исходя из предыдущий запросов мы имеем: два корабля, который нет в Ships, то есть Bismark и Japanez; с помощью запроса
SELECT ROUND( AVG( launched ) )
FROM Ships
JOIN Classes
USING ( class )
WHERE Classes.country =  'Japan'
можно определить средний год. Самая проблема теперь заключается в том, как определить класс у Japanez и как реализовать функцию, которые бы отбросила Bismark из списка добавляемых из-за того, что его средний год определить нельзя. Жду Вашего решения. ))

Отредактированно pkhell (04.05.2011 18:06:43)


Прикрепленные файлы:
Attachment Icon Ships2.txt, Размер: 4,184 байт, Скачано: 690

Неактивен

 

#27 04.05.2011 22:58:38

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: 3 непонятных запроса

Тогда по условию NULL smile

Ну или действительно добавить fake-кораблей, чтобы убедиться, что запрос
работает.

Неактивен

 

#28 05.05.2011 13:17:48

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

Re: 3 непонятных запроса

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

Неактивен

 

#29 05.05.2011 13:19:01

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

Re: 3 непонятных запроса

К тому же надо создать условие, чтобы Bismark не добавлялся. Тут тоже сложновато понять.

Неактивен

 

#30 07.05.2011 13:22:20

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

Re: 3 непонятных запроса

Ну что-то Вы совсем про меня позабыли, а я без Вашей помощи дальше двинуться не могу...

Неактивен

 

#31 08.05.2011 12:28:19

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

Re: 3 непонятных запроса

После долгих мучений у меня получилось следующее:

INSERT INTO Ships (name, class, launched) VALUES (
(SELECT s.ship
FROM (
SELECT o.ship, c.country, (
SELECT ROUND( AVG( launched ) , 0 )
FROM Ships
INNER JOIN Classes ON Classes.class = Ships.name
WHERE Classes.country = c.country
) AS launched
FROM Outcomes o
LEFT JOIN Ships s ON o.ship = s.name
JOIN Classes c ON c.class = o.ship
WHERE s.name IS NULL
) AS S
WHERE s.launched IS NOT NULL),
(SELECT t.class FROM (SELECT p.class, (
SELECT ROUND( AVG( launched ) , 0 )
FROM Ships
INNER JOIN Classes ON Classes.class = Ships.name
WHERE Classes.country = c.country
) AS launched
FROM (
SELECT Classes.class
FROM Classes
JOIN (
SELECT o.ship, c.country
FROM Outcomes AS o
LEFT JOIN Ships AS s ON o.ship = s.name
JOIN Classes AS c ON c.class = o.ship
WHERE s.name IS NULL
) AS N ON Classes.country = N.country
) AS P
LEFT JOIN Ships AS s ON p.class = s.name
JOIN Classes AS c ON c.class = p.class
WHERE s.name IS NULL) AS T WHERE t.launched IS NOT NULL),
(SELECT f.launched
FROM (
SELECT o.ship, c.country, (
SELECT ROUND( AVG( launched ) , 0 )
FROM Ships
INNER JOIN Classes ON Classes.class = Ships.name
WHERE Classes.country = c.country
) AS launched
FROM Outcomes o
LEFT JOIN Ships s ON o.ship = s.name
JOIN Classes c ON c.class = o.ship
WHERE s.name IS NULL
) AS F
WHERE f.launched IS NOT NULL))

Paulus, пожалуйста, скажите, как можно создать запрос на последнюю задачу, описанную в данной теме?

Неактивен

 

#32 12.05.2011 21:24:06

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: 3 непонятных запроса

Ух, давно не заходил smile

По третьему заданию подсказка есть в http://sqlinfo.ru/forum/viewtopic.php?pid=24440#p24440

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

Неактивен

 

#33 12.05.2011 22:26:45

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

Re: 3 непонятных запроса

Я уже скучать начал. ))) Подсказки не хватает, не понимаю я эту задачу. Предыдущую, кстати, смог доделать и сдать. ))

Неактивен

 

#34 12.05.2011 23:25:25

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: 3 непонятных запроса

Вот, замечательно, что сделали самостоятельно smile

Для начала надо разобраться с заданием — понять, что за корабли нас интересуют.
Мне кажется, что это корабли, которые побывали как минимум в двух битвах, и
в обеих битвах оказались ранеными. Это будет некоторый подзапрос. Из этого
подзапроса надо выбрать строки битв, которые были самыми поздними для одного
корабля (например, сгруппировать и вытащить максимальную дату сражения).
И вот для этих строк нужно поставить «убит» вместо «ранен» smile

Неактивен

 

#35 14.05.2011 09:14:03

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

Re: 3 непонятных запроса

Хм. Тогда мне очень интересно, где находится информация о второй битве? Корабли и их битвы указаны лишь в таблице Outcomes.

Неактивен

 

#36 14.05.2011 17:34:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: 3 непонятных запроса

Именно там и хранится, что Вас смущает?

Неактивен

 

#37 14.05.2011 18:20:09

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

Re: 3 непонятных запроса

Не понимаю. Исходя из этой таблицы я получаю лишь одну битву для одного корабля. Или я совсем глуп??? Если честно, я тут вообще ничего не понимаю. Не могу алгоритм составить. ((

Неактивен

 

#38 14.05.2011 18:44:02

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: 3 непонятных запроса

Ну, не совсем (один корабль таки стоит затопить wink ):

Код:

[silentia] root test > SELECT ship, MAX(date), COUNT(*) FROM Outcomes o JOIN Battles b ON b.name = o.battle GROUP BY 1;
+-----------------+---------------------+----------+
| ship            | MAX(date)           | COUNT(*) |
+-----------------+---------------------+----------+
| Bismarck        | 1941-05-25 00:00:00 |        1 |
| California      | 1944-10-25 00:00:00 |        2 |
| Duke of York    | 1943-12-26 00:00:00 |        1 |
| Fuso            | 1944-10-25 00:00:00 |        1 |
| Hood            | 1941-05-25 00:00:00 |        1 |
| Japanez         | 1941-05-25 00:00:00 |        1 |
| King George V   | 1941-05-25 00:00:00 |        1 |
| Kirishima       | 1942-11-15 00:00:00 |        1 |
| Prince of Wales | 1941-05-25 00:00:00 |        1 |
| Rodney          | 1941-05-25 00:00:00 |        1 |
| Schamhorst      | 1943-12-26 00:00:00 |        1 |
| South Dakota    | 1942-11-15 00:00:00 |        1 |
| Tennessee       | 1944-10-25 00:00:00 |        1 |
| Washington1     | 1942-11-15 00:00:00 |        1 |
| West Virginia   | 1944-10-25 00:00:00 |        1 |
| Yamashiro       | 1944-10-25 00:00:00 |        1 |
+-----------------+---------------------+----------+
16 rows in set (0.00 sec)

Неактивен

 

#39 15.05.2011 16:56:37

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

Re: 3 непонятных запроса

Хм. Задание звучит так:
Потопить в следующем сражении суда, которые в первой своей битве были повреждены и больше не участвовали ни в каких сражениях. Если следующего сражения для такого судна не существует в базе данных, не вносить его в таблицу Outcomes. Замечание: в базе данных нет двух сражений, которые состоялись бы в один день.
Из вышесказанно следует, что корабль должен быть поврежден в первом сражении и больше не участвовать в боях. Исходя из Outcomes, имеется всего один корабль, который был в 2 сражениях, но в первом он не был поврежден. Мы имеем корабли, которые были повреждены, но мы не может узнать, участвовали ли они в следующих сражениях или нет. Мне кажется, что из подобной базы этого не узнать и имеется необходимость добавить новый. Причем надо потопить, то есть UPDATE, но зачем еще надо и добавлять корабли??? Не понимаю. Жду Вашего мнения.

Неактивен

 

#40 19.05.2011 01:56:09

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: 3 непонятных запроса

Эм. Значит, я неправильно прочитал задание. Мне казалось, топить надо как раз те,
которые участвовали второй раз.

Ок, тогда поправьте меня, если я ошибаюсь в следующих утверждениях:
1. Корабль, который был поврежден в первой своей битве, и больше нигде не участ-
вующий должен иметь только одну строку в таблице сражений.
2. Мы не должны вносить в таблицу сражений новые сражения.
3. Мы должны внести в таблицу сражений новое сражение, в котором должны потопить
корабль.

Так как пункты 2 и 3 конфликтуют между собой, сделаем вывод, что условие несамосог-
ласовано, а потому мы должны его немного изменить, чтобы не приходить с пустыми
руками. Например, так. Будем считать, что корабль, который был ранен в одном сраже-
нии, считается не участвующим в последующих сражениях в том случае, если в после-
дующих сражениях написано, что он «живой».

Тогда нас интересуют корабли, у которых есть по крайней мере две записи в таблице
сражений, первая из которых — «ранен», а вторая, — «жив». Для всех таких кораблей
нужно заменить «жив» на «убит».

Такое решение устроит?

Неактивен

 

#41 19.05.2011 12:04:15

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

Re: 3 непонятных запроса

Вот тебе раз! )) Прям сочинение получилось. Логика, я думаю, у Вас правильная, вот только суть решения я все равно не могу уловить. У нас нет второго сражения, следовательно, нет нужных кораблей. Я прав? Мне кажется, что следует добавить корабль. ))

Отредактированно pkhell (19.05.2011 12:05:14)

Неактивен

 

#42 19.05.2011 19:41:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: 3 непонятных запроса

У нас есть один корабль, который удовлетворяет всем рассуждениям: California.
Он как раз был один раз подбит, а в следующем сражении выжил. Предлагаю
его потопить и забыть про эту задачку smile

Неактивен

 

#43 19.05.2011 21:30:44

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

Re: 3 непонятных запроса

Уважаемый paulus. Благодаря Вашим наставлениям у меня получился запрос следующего вида:

UPDATE Outcomes SET result =  'sunk' WHERE ship = (
SELECT g.ship
FROM (
SELECT ship, R.q
FROM (
SELECT ship, MAX( DATE ) , COUNT( * ) AS q
FROM Outcomes o
JOIN Battles b ON b.name = o.battle
GROUP BY 1
) AS R
WHERE R.q =2
) AS g
) AND result = 'ok'

Как вы считаете, логичен ли он?

Неактивен

 

#44 21.05.2011 18:53:59

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: 3 непонятных запроса

Мне нравится smile

Неактивен

 

Board footer

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