Задавайте вопросы, мы ответим
Вы не зашли.
Есть небольшая БД:
Неактивен
Вы странно применяете left join.
Что должно быть в случае если какой-то сорт рыбы вообще никем не вылавливался?
В первом варианте у вас выбираются поля, по которым не проводится группировка и нет группирующей функции (f.Name AS FName, b.Name AS BName,)
Неактивен
Не судите строго, я только учусь)
JOIN применял для подстановки значений вместо айдишников.
Вероятно, правильней использовать ссылки типа v.ID_Boat=b.ID_Boat вместо JOIN?
Отредактированно ghostvii (01.10.2012 17:37:52)
Неактивен
Нет, просто вы неправильно применяете left join. Рекомендую посмотреть тему http://sqlinfo.ru/forum/viewtopic.php?id=3210
Что касается вашего запроса, то попробуйте сначала составить простой вариант для айдишников.
Неактивен
Вариант 1:
Отредактированно ghostvii (01.10.2012 18:57:04)
Неактивен
После продолжительных мучений гугла и своих мозгов нашел решение проблемы. Вот что получилось:
Неактивен
Не нашли.
А если добавить вояж №6, в котором катер №1 поймал 350 единиц рыбы №3?
То получится, что катер №1 для третьей рыбы будет фигурировать дважды.
P.S. Если это не контрольная то учтите, что в текущей реализации MySQL подзапросы в части in работают очень медленно. Нужно или использовать MariaDB, или переписывать их через join.
Неактивен
Не контрольная, всего лишь лаба, сгодится и так. Но через JOIN попробую.
vasya написал:
Не нашли.
А если добавить вояж №6, в котором катер №1 поймал 350 единиц рыбы №3?
То получится, что катер №1 для третьей рыбы будет фигурировать дважды.
Тут только кусок БД, необходимый для этого запроса.
Итоговый вариант запроса такой:
Отредактированно ghostvii (01.10.2012 22:11:03)
Неактивен
ghostvii написал:
Мне было важно вытащить несколько одинаковых максимальных значений. По условию вес указывается по сортам рыбы. Поэтому в одном рейсе не может быть двух одинаковых сортов. А так как в запросе есть поле VDate (возвращение из рейса), все нормально.
Во-первых, условие
AND v.Date_Finish
BETWEEN '".$StartDate."'
AND '".$FinishDate."'
не согласуется с первоначальной постановкой задачи " вывести для каждого сорта рыб (ID_Fish) список катеров (ID_Boat) с наибольшим уловом (Weight)."
Во-вторых, оно всего лишь указывает диапазон даты возвращения из рейса. И в этот диапазон могут попасть несколько рейсов одно и того же катера, т.е. приходим к возможности ситуации, описанной мной в прошлом посте.
Даже если считать прошлый вариант запроса верным, то зачем в усложненной версии вы пишите, например, "Voyage v
LEFT JOIN Boat b"?
Разве у вас могут быть рейсы с катерами для которых нет соответствия в таблице Boat?
Неактивен
Извиняюсь, что не указал полное условие выборки.
vasya написал:
Во-вторых, оно всего лишь указывает диапазон даты возвращения из рейса. И в этот диапазон могут попасть несколько рейсов одно и того же катера, т.е. приходим к возможности ситуации, описанной мной в прошлом посте.
На скрине как раз такой момент (для одного катера 2 рейса и один сорт рыбы). А возвращение катера из 2 рейсов за один день попробую обойти условиями в php.
vasya написал:
Даже если считать прошлый вариант запроса верным, то зачем в усложненной версии вы пишите, например, "Voyage v LEFT JOIN Boat b"?
Разве у вас могут быть рейсы с катерами для которых нет соответствия в таблице Boat?
Нет, таких не может быть по условию внешнего ключа ID_Boat. Просто, пока экспериментировал с запросами, легче было держать ссылку через JOIN. Кстати, это критично? Что будет работать быстрее, JOIN или v.ID_Boat=b.ID_Boat?
Неактивен
ghostvii написал:
Что будет работать быстрее, JOIN или v.ID_Boat=b.ID_Boat?
Это одно и тоже. А вот join и left join разные вещи.
Почитайте http://sqlinfo.ru/forum/viewtopic.php?id=3210
Неактивен
Убрал LEFT у JOIN) Спасибо за помощь!
Неактивен