Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1 2
Здравствуйте. Уже несколько дней бьюсь над двумя задачами:
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.
Очень надеюсь на Вашу помощь. Заранее спасибо.
Неактивен
Очень прошу помощи. Горю со страшной силой.
Неактивен
Хм, а могли бы понять первую задачку.
Список классов кораблей США:
[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)
Второе задание (раз оно понятно) предлагаю сделать по аналогии
Неактивен
Спасибо. Понятно та понятно, но я не могу написать его. Смотрел пример на SQL-EX, понял часть структуры, но не могу понять, как добавить страну, у которой ничего нет. Имеется следующая структура
Неактивен
Приведенное Ваши решение вызывает ошибку в phpmyadmin, в среде которого выполняется решение.
Неактивен
Не могу понять, что за X и откуда SQL понимает его значение?
Неактивен
Надо не в интернете примеры искать, а думать Иначе для чего Вы учитесь?
[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 есть, да. Воспрользуйтесь работающим клиентом
Неактивен
Что думать - это понятно. Просто я уже совсем свихнулся с этой задачей, решил глянуть. Тут уж извините, не сдержался. Каюсь. Проблема в том, что только в phpmyadmin я могу работать, условие такое.
Неактивен
Вторая задача тоже не проходит в phpmyadmin, к тому же финальный результат не содержит количество спущенных кораблей.
Неактивен
Я понимаю, что, возможно, многого требую, но обратиться больше не к кому.
Неактивен
Хорошо, давайте попробуем починить Ваш pma. Что означает «не проходит»?
Неактивен
Неактивен
В запросе дважды используется таблица classes, чтобы их различать одной из них присвоен алиас x.
Насколько я понимаю из приведенного вами скана - запрос select .. проходит. Этот рисунок вы сделали в фотошопе, объеденив сканы разных запрросов, или на запрос select возращается такая картина?
Неактивен
Самое интересное, что запрос выполнился (судя по правильному количеству строк),
а вот вывести его pma не захотел, потому что посчитал себя умнее MySQL. Попробуйте
добавить AS между Classes и x: может, анализатор pma ждет этого слова?
P.S. Но вообще, Ваше изучение баз превратится в изучение способов обходов ошибок
pma. Предлагаю сначала изучить базы в каком-нибудь клиенте, который работает, а
потом уже изучать ошибки pma.
Неактивен
vasya написал:
В запросе дважды используется таблица classes, чтобы их различать одной из них присвоен алиас x.
Насколько я понимаю из приведенного вами скана - запрос select .. проходит. Этот рисунок вы сделали в фотошопе, объеденив сканы разных запрросов, или на запрос select возращается такая картина?
Это все один запрос, скан сделан PrintScreen-ом монитора и ничего больше. Такой идет ответ от сервера.
Неактивен
paulus написал:
Самое интересное, что запрос выполнился (судя по правильному количеству строк),
а вот вывести его pma не захотел, потому что посчитал себя умнее MySQL. Попробуйте
добавить AS между Classes и x: может, анализатор pma ждет этого слова?
P.S. Но вообще, Ваше изучение баз превратится в изучение способов обходов ошибок
pma. Предлагаю сначала изучить базы в каком-нибудь клиенте, который работает, а
потом уже изучать ошибки pma.
В том месте, в котором я изучаю обязательное требование - phpmyadmin, поэтому иные варианты я использовать не могу. Добавление я делал, сути возврата это не меняет.
Отредактированно pkhell (09.04.2011 14:47:46)
Неактивен
CREATE VIEW x AS SELECT * FROM Classes — после этого заработает?
UPD: Но вообще это напоминает обучение вождению с условием «в том
месте, где я обучаюсь обязательно сидеть на заднем сидении при этом»
Неактивен
Данную задачку выдали в университете. Я обязан сделать именно в phpmyadmin и ни в чем другом.
Неактивен
После Вашего примера запрос работает, но как тогда объединить оба этих запроса в один?
Отредактированно pkhell (09.04.2011 14:57:48)
Неактивен
Использование временной таблицы не работает, а доп.таблица - это не правильно.
Неактивен
Это не доп.таблица, это представление, чтобы работал phpMyAdmin. В моей аналогии —
это удлиннятели ног и вытягиватель руля до заднего сидения
Неактивен
Получается, что без данного представления работать ничего не будет, просто оно создает дополнительную таблицу? А иная реализация возможна? Я попробовал поэкспериментировать с алиасами, не работает.
Отредактированно pkhell (09.04.2011 15:43:35)
Неактивен
Как мы выяснили, phpMyAdmin отказывается выводить результаты работы запросов
с алиасами. Без алиасов Вы не можете обратиться к одной таблице дважды. Сочувствую.
Предлагаю показать преподавателю, что запрос работает, а pma — нет.
Неактивен
Эту проблемы я как-нибудь, может, и решу. Меня интересует еще один вопрос: Вы привели пример запроса на вторую задачу, но в ней не содержится поле, в котором указано количество кораблей. Не могли бы Вы написать подредактированный запрос и View поля для него? Спасибо.
Неактивен
pkhell написал:
Вы привели пример запроса на вторую задачу, но в ней не содержится поле, в котором указано количество кораблей. Не могли бы Вы написать подредактированный запрос
Неактивен
Страниц: 1 2