SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 08.04.2011 17:22:58

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

Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Здравствуйте. Уже несколько дней бьюсь над двумя задачами:
1.Для каждого американского класса кораблей (USA) определить средний калибр орудий всех классов кораблей с таким же числом главных орудий. (Данную задачу я даже понять не могу)
2.Для каждой страны определить год, когда на воду было спущено максимальное количество ее кораблей. В случае, если окажется несколько таких лет, взять минимальный из них. Вывод: страна, количество кораблей, год
Структура базы (сама база в файле):
Рассматривается БД кораблей, участвовавших во второй мировой войне. Имеются следующие отношения:

Battles (name, date)
Classes (class, type, country, numGuns, bore, displacement)
Outcomes (ship, battle, result)
Ships (name, class, launched)

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

Отношение Classes содержит имя класса, тип (bb для боевого (линейного) корабля или bc для боевого крейсера), страну, в которой построен корабль, число главных орудий, калибр орудий (диаметр ствола орудия в дюймах) и водоизмещение ( вес в тоннах). В отношении Ships записаны название корабля, имя его класса и год спуска на воду. В отношение Battles включены название и дата битвы, в которой участвовали корабли, а в отношении Outcomes – результат участия данного корабля в битве (потоплен-sunk, поврежден - damaged или невредим - OK). Замечание. В отношение Outcomes могут входить корабли, отсутствующие в отношении Ships.

Очень надеюсь на Вашу помощь. Заранее спасибо.


Прикрепленные файлы:
Attachment Icon ships.txt, Размер: 5,187 байт, Скачано: 759

Неактивен

 

#2 08.04.2011 22:01:45

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Очень прошу помощи. Горю со страшной силой.

Неактивен

 

#3 08.04.2011 22:09:10

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

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

Список классов кораблей США:

Код:

[silentia] root test > select * from Classes where country = 'USA';
+----------------+------+---------+---------+------+--------------+
| class          | type | country | numGuns | bore | displacement |
+----------------+------+---------+---------+------+--------------+
| Iowa           | bb   | USA     |       9 |   16 |        46000 |
| North Carolina | bb   | USA     |      12 |   16 |        37000 |
| Tennessee      | bb   | USA     |      12 |   13 |        32000 |
+----------------+------+---------+---------+------+--------------+
3 rows in set (0.00 sec)

У каждого класса есть количество орудий (9 и 12). Нужно найти средний калибр
орудий внутри класса с одинаковым количеством этих самых орудий:

Код:

[silentia] root test > select numGuns, avg(bore) from Classes group by numGuns;
+---------+--------------------+
| numGuns | avg(bore)          |
+---------+--------------------+
|       6 |                 15 |
|       8 | 14.666666666666666 |
|       9 |                 17 |
|      12 |               14.5 |
+---------+--------------------+
4 rows in set (0.00 sec)

Дальше можно или показать пальцами, на чиселки в двух выборках или как-то их
объединить. Например, так:

Код:

[silentia] root test > SELECT class, numGuns, (SELECT avg(bore) FROM Classes WHERE numGuns = x.numGuns) FROM Classes x WHERE country = 'USA';
+----------------+---------+-----------------------------------------------------------+
| class          | numGuns | (SELECT avg(bore) FROM Classes WHERE numGuns = x.numGuns) |
+----------------+---------+-----------------------------------------------------------+
| Iowa           |       9 |                                                        17 |
| North Carolina |      12 |                                                      14.5 |
| Tennessee      |      12 |                                                      14.5 |
+----------------+---------+-----------------------------------------------------------+
3 rows in set (0.00 sec)

Второе задание (раз оно понятно) предлагаю сделать по аналогии smile

Неактивен

 

#4 08.04.2011 22:46:51

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Спасибо. Понятно та понятно, но я не могу написать его. Смотрел пример на SQL-EX, понял часть структуры, но не могу понять, как добавить страну, у которой ничего нет. Имеется следующая структура
   

SELECT country, QTY, MIN(launched)
    FROM (SELECT country, launched, COUNT(name) QTY
    FROM Classes c JOIN
    Ships s ON c.class = s.class
    GROUP BY country,launched
    HAVING COUNT(name) = (SELECT MAX(qty)
    FROM (SELECT country,launched,COUNT(name) qty
    FROM Classes c1 JOIN
    Ships s1 ON c1.class = s1.class
    WHERE country = c.country
    GROUP BY country,launched
    )e
    )
    )T
    GROUP BY t.qty, t.country

В ней, если заменить JOIN на LEFT JOIN получается, по сути, нужный результат, но вместо NULL-значения на количестве кораблей у Germany получаю 0, а это не верно. Прошу совета.

Неактивен

 

#5 08.04.2011 22:53:00

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Приведенное Ваши решение вызывает ошибку в phpmyadmin, в среде которого выполняется решение.

Неактивен

 

#6 08.04.2011 22:57:59

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Не могу понять, что за X и откуда SQL понимает его значение?

Неактивен

 

#7 08.04.2011 23:01:54

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Надо не в интернете примеры искать, а думать sad Иначе для чего Вы учитесь? sad

Код:

[silentia] root test > select c.country, (select launched from Ships join Classes x using(class) where x.country = c.country group by 1 order by count(*) desc, 1 limit 1) year from Classes c group by 1;
+------------+------+
| country    | year |
+------------+------+
| Germany    | NULL |
| Gt.Britain | 1916 |
| Japan      | 1913 |
| USA        | 1941 |
+------------+------+
4 rows in set (0.00 sec)

А ошбки в phpMyAdmin есть, да. Воспрользуйтесь работающим клиентом wink

Неактивен

 

#8 08.04.2011 23:06:31

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Что думать - это понятно. Просто я уже совсем свихнулся с этой задачей, решил глянуть. Тут уж извините, не сдержался. Каюсь. Проблема в том, что только в phpmyadmin я могу работать, условие такое.

Неактивен

 

#9 08.04.2011 23:07:38

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

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

Неактивен

 

#10 08.04.2011 23:10:09

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Я понимаю, что, возможно, многого требую, но обратиться больше не к кому.

Неактивен

 

#11 09.04.2011 00:45:37

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Хорошо, давайте попробуем починить Ваш pma. Что означает «не проходит»? smile

Неактивен

 

#12 09.04.2011 13:06:15

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Выходит ошибка на X-таблицу. phpmyadmin не понимает, что это за значение и откуда оно берется.
http://img135.imageshack.us/img135/6483/46566056.jpg
Лично я даже понять не могу сути написанного Вами решения.

Отредактированно pkhell (09.04.2011 13:13:03)

Неактивен

 

#13 09.04.2011 13:45:03

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

В запросе дважды используется таблица classes, чтобы их различать одной из них присвоен алиас x.
Насколько я понимаю из приведенного вами скана - запрос select .. проходит. Этот рисунок вы сделали в фотошопе, объеденив сканы разных запрросов, или на запрос select возращается такая картина?

Неактивен

 

#14 09.04.2011 14:40:19

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Самое интересное, что запрос выполнился (судя по правильному количеству строк),
а вот вывести его pma не захотел, потому что посчитал себя умнее MySQL. Попробуйте
добавить AS между Classes и x: может, анализатор pma ждет этого слова?

P.S. Но вообще, Ваше изучение баз превратится в изучение способов обходов ошибок
pma. Предлагаю сначала изучить базы в каком-нибудь клиенте, который работает, а
потом уже изучать ошибки pma.

Неактивен

 

#15 09.04.2011 14:46:02

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

vasya написал:

В запросе дважды используется таблица classes, чтобы их различать одной из них присвоен алиас x.
Насколько я понимаю из приведенного вами скана - запрос select .. проходит. Этот рисунок вы сделали в фотошопе, объеденив сканы разных запрросов, или на запрос select возращается такая картина?

Это все один запрос, скан сделан PrintScreen-ом монитора и ничего больше. Такой идет ответ от сервера.

Неактивен

 

#16 09.04.2011 14:47:04

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

paulus написал:

Самое интересное, что запрос выполнился (судя по правильному количеству строк),
а вот вывести его pma не захотел, потому что посчитал себя умнее MySQL. Попробуйте
добавить AS между Classes и x: может, анализатор pma ждет этого слова?

P.S. Но вообще, Ваше изучение баз превратится в изучение способов обходов ошибок
pma. Предлагаю сначала изучить базы в каком-нибудь клиенте, который работает, а
потом уже изучать ошибки pma.

В том месте, в котором я изучаю обязательное требование - phpmyadmin, поэтому иные варианты я использовать не могу. Добавление я делал, сути возврата это не меняет.

Отредактированно pkhell (09.04.2011 14:47:46)

Неактивен

 

#17 09.04.2011 14:49:07

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

CREATE VIEW x AS SELECT * FROM Classes — после этого заработает?

UPD: Но вообще это напоминает обучение вождению с условием «в том
месте, где я обучаюсь обязательно сидеть на заднем сидении при этом» sad

Неактивен

 

#18 09.04.2011 14:52:56

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Данную задачку выдали в университете. Я обязан сделать именно в phpmyadmin и ни в чем другом.

Неактивен

 

#19 09.04.2011 14:54:27

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

После Вашего примера запрос работает, но как тогда объединить оба этих запроса в один?

Отредактированно pkhell (09.04.2011 14:57:48)

Неактивен

 

#20 09.04.2011 14:55:47

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Использование временной таблицы не работает, а доп.таблица - это не правильно.

Неактивен

 

#21 09.04.2011 15:39:21

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Это не доп.таблица, это представление, чтобы работал phpMyAdmin. В моей аналогии —
это удлиннятели ног и вытягиватель руля до заднего сидения smile

Неактивен

 

#22 09.04.2011 15:42:06

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Получается, что без данного представления работать ничего не будет, просто оно создает дополнительную таблицу? А иная реализация возможна? Я попробовал поэкспериментировать с алиасами, не работает.

Отредактированно pkhell (09.04.2011 15:43:35)

Неактивен

 

#23 09.04.2011 15:48:02

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Как мы выяснили, phpMyAdmin отказывается выводить результаты работы запросов
с алиасами. Без алиасов Вы не можете обратиться к одной таблице дважды. Сочувствую.

Предлагаю показать преподавателю, что запрос работает, а pma — нет.

Неактивен

 

#24 09.04.2011 15:53:40

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

Эту проблемы я как-нибудь, может, и решу. Меня интересует еще один вопрос: Вы привели пример запроса на вторую задачу, но в ней не содержится поле, в котором указано количество кораблей. Не могли бы Вы написать подредактированный запрос и View поля для него? Спасибо.

Неактивен

 

#25 09.04.2011 23:46:17

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

Re: Прошу помочь с двумя задачами (совпадение с SQl-ex - случайность)

pkhell написал:

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

select c.country,
(select launched from Ships join Classes x using(class)
where x.country = c.country group by 1 order by count(*) desc, 1 limit 1) year,
(select count(*) from Ships join Classes x using(class)
where x.country = c.country group by launched order by count(*) desc, 1 limit 1) `количество`
from Classes c group by 1;

Неактивен

 

Board footer

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