Упражнение 124
Среди пассажиров, которые пользовались услугами не менее двух авиакомпаний, найти тех, кто совершил одинаковое количество полётов самолетами каждой из этих авиакомпаний. Вывести имена таких пассажиров.
Эта задача порождает массу ошибочных решений, которые я разделяю на две группы. К первой группе относятся решения, связанные с неверным прочтением формулировки. Например, пытаются найти двух пассажиров, которые летали бы одинаково двумя или большим числом компаний.
Поясню, что рассматривать следует отдельного пассажира и подсчитываеть число полетов, которое он сделал каждой из авиакомпаний, которыми летал.
Что дальше? Рассмотрим теперь пример из второй группы ошибочных решений:
Консоль
Выполнить
Сразу отметим ошибочное DISTINCT name, которое устраняет возможных однофамильцев. Однако не это здесь главное. В предложении FROM соединяются два одинаковых запроса

Консоль
Выполнить
которые, как и сказано выше, подсчитывают для каждого пассажира число полетов, которое он совершил самолетами каждой из компаний.
Соединяются эти запросы по следующим условиям:
- пассажир тот же самый;
- компании разные;
- число полетов совпадает.
Итак, если пассажир совершил, скажем, компанией Aeroflot 3 полета, и также 3 полета он совершил самолетами компании Don_avia, то такой пассажир удовлетворяет условиям соединения и будет выведен в результатах запроса. Если пассажир летал всего двумя компаниями, то это — правильный результат. А если компании три?
Если в результате рассмотренного выше подзапроса мы получим
Итак, число полетов пассажира каждой из компаний, которыми он летал, должно находиться в пропорции 1:1. 1.
Помогите понять задачу SQL-academy 14
Здравствуйте, проходил задание 14 и случился затуп, не уверен в правильности своего решения.
https://sql-academy.org/ru/trainer/tasks/14
В какие города летал Bruce Willis
Поля в результирующей таблице: town_to
SELECT t.town_to
FROM Trip AS t
JOIN Pass_in_trip AS pt ON pt.trip=t.id
JOIN Passenger AS p ON p.id=pt.passenger
AND p.name=’Bruce Willis’
GROUP BY t.town_to
Мне кажется для простого задания слишком перемудрил, можно это объединять легче или есть решение проще? — запрос валиден

ERD прикладываю
Лучший ответ
Условие (то, что здесь p.name=’Bruce Willis’) обычно записывается в разделе WHERE, даже если его и можно воткнуть в JOIN.
В остальном я не вижу проблем, это довольно типичная задача и решение
h9lkЗнаток (407) 2 года назад
Сначала писал WHERE, а потом увидел что как учебнике JOIN используют с условием через AND, думал так правильнее, спасибо за объяснили, учту
Остальные ответы
Еще вместо GROUP BY можно использовать DISTINCT, хотя в данном случае смысл от этого не меняется совершенно.
SELECT DISTINCT town_to
FROM Trip
JOIN Pass_in_trip
ON Trip.id=Pass_in_trip.trip
JOIN Passenger
ON Pass_in_trip.passenger=Passenger.id
Where name=’Bruce Willis’;
Объединение таблиц и выборка
В какие города летал Bruce Willis?
Я так понимаю что здесь необходимо использовать JOIN для объединения нескольких таблиц, но на основе каких критериев их объединять если все столбцы в таблицах разные?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Выборка и объединение из 2 разных таблиц и 2 разных полей
Подскажите, пожалуйста, как составить запрос. Мне необходимо из 2 таблиц выбрать одинаковые.
Выборка и объединение
Здравствуйте, кто может помочь, а лучше написать код. Проблема не большая, но сам разобраться не.
Объединение таблиц
Здравствуйте , у меня есть 2 таблицы users tickets , как мне объединить их в 1 таблице totals. .
Объединение таблиц
Здравствуйте, не могу связать правильно таблицы. Суть такова: Пользователь, представитель фирмы.
Регистрация: 06.03.2014
Сообщений: 85
SELECT town_to FROM trip LEFT JOIN pass_in_trip ON trip.id = pass_in_trip.trip LEFT JOIN passenger ON pass_in_trip.passenger = passenger.id WHERE passenger.name='Bruce Willis'
Регистрация: 06.03.2014
Сообщений: 85
Точнее для строк используйте не =, а оператор
LIKE
4214 / 3054 / 582
Регистрация: 21.01.2011
Сообщений: 13,205
Сообщение от Yarik1994 
для строк используйте не =, а оператор LIKE
LIKE полезен, когда используются шаблонные символы типа %. В данном случае = и LIKE равнозначны
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Объединение таблиц
Привет всем. Подскажите кто-то, пожалуйста. У меня есть такие таблицы(первые 3 фото), а нужно их.

Объединение таблиц
Подскажите, как произвести объединение таблиц user(поля: фамилию,имя,отчество) и hospital_map(поля.
Объединение таблиц
Все привет! Необходимо объединить две талицы, у таблиц совпадают поля id, мне же необходимо.
Объединение таблиц
SELECT * FROM `page` INNER JOIN `site` ON ‘page’.’site’=’site’.’id’; даёт гогу: . Что я не так.
Объединение таблиц
Как объединить все таблицы которые начинаются на какой то символ? Ну к примеру мне нужно объединить.
Объединение таблиц
Доброго времени суток. Помогите, пожалуйста, разобраться. Сразу предупреждаю, что mysql никогда не.
SQL ACADEMY ответы и решения заданий (часть 1, задания 1-22)

SQL Academy (ответы и решения заданий 1-22)
ВКонтакте WhatsApp Pinterest Facebook Email
Ниже представлены наши варианты решения заданий из онлайн тренажера на сайте SQL ACADEMY (sql-academy.org). Ответы на 66 заданий представленные в онлайн тренажере разбиты на 3 части. Здесь, в первой части, представлены ответы на первые 22 задания.
Задание 1. Вывести имена всех когда-либо обслуживаемых пассажиров авиакомпаний.
SELECT name FROM Passenger;
Задание 2. Вывести названия всеx авиакомпаний.
SELECT name FROM Company;
Задание 3. Вывести все рейсы, совершенные из Москвы
SELECT * FROM Trip WHERE town_from = 'Moscow';
Задание 4. Вывести имена людей, которые заканчиваются на “man”
SELECT name FROM Passenger WHERE name LIKE '%man';
Задание 5. Вывести количество рейсов, совершенных на TU-134
SELECT COUNT(*) AS count FROM Trip WHERE plane = 'TU-134';
Задание 6. Какие компании совершали перелеты на Boeing
SELECT DISTINCT name FROM Company JOIN Trip ON Company.id=Trip.company WHERE plane = 'Boeing';
Задание 7. Вывести все названия самолётов, на которых можно улететь в Москву (Moscow)
SELECT DISTINCT plane FROM Trip WHERE town_to = 'Moscow';
Задание 8. В какие города можно улететь из Парижа (Paris) и сколько времени это займёт?
SELECT town_to, TIMEDIFF(time_in, time_out) AS flight_time FROM Trip WHERE town_from = 'Paris';
Задание 9. Какие компании организуют перелеты с Владивостока (Vladivostok)?
SELECT DISTINCT name FROM Company JOIN Trip ON Company.id=Trip.company WHERE town_from = 'Vladivostok';
Задание 10. Вывести вылеты, совершенные с 10 ч. по 14 ч. 1 января 1900 г.
SELECT * FROM Trip WHERE time_out BETWEEN '1900-01-01 10:00:00' AND '1900-01-01 14:00:00';
Задание 11. Вывести пассажиров с самым длинным именем
SELECT name FROM Passenger WHERE LENGTH(name) = (SELECT MAX(LENGTH(name)) FROM Passenger);
Задание 12. Вывести id и количество пассажиров для всех прошедших полётов
SELECT trip, COUNT(passenger) as count FROM Pass_in_trip GROUP BY trip;
Задание 13. Вывести имена людей, у которых есть полный тёзка среди пассажиров
SELECT name FROM Passenger GROUP BY name HAVING COUNT(name) > 1;
Задание 14. В какие города летал Bruce Willis?
SELECT DISTINCT town_to FROM Trip JOIN Pass_in_trip ON Trip.id=Pass_in_trip.trip JOIN Passenger ON Pass_in_trip.passenger=Passenger.id WHERE name = 'Bruce Willis';
Задание 15. Во сколько Стив Мартин (Steve Martin) прилетел в Лондон (London)?
SELECT time_in FROM Trip JOIN Pass_in_trip ON Trip.id=Pass_in_trip.trip JOIN Passenger ON Pass_in_trip.passenger=Passenger.id WHERE name='Steve Martin' AND town_to='London';
Задание 16. Вывести отсортированный по количеству перелетов (по убыванию) и имени (по возрастанию) список пассажиров, совершивших хотя бы 1 полет.
SELECT name, COUNT(*) AS count FROM Passenger JOIN Pass_in_trip ON Passenger.id=Pass_in_trip.passenger GROUP BY passenger HAVING COUNT(trip) > 0 ORDER BY COUNT(trip) DESC, name;
Задание 17. Определить, сколько потратил в 2005 году каждый из членов семьи
SELECT member_name, status, SUM(amount*unit_price) AS costs FROM FamilyMembers JOIN Payments ON FamilyMembers.member_id=Payments.family_member WHERE YEAR(date) = 2005 GROUP BY member_name, status;
Задание 18. Узнать, кто старше всех в семьe
SELECT member_name FROM FamilyMembers WHERE birthday = (SELECT MIN(birthday) FROM FamilyMembers);
Задание 19. Определить, кто из членов семьи покупал картошку (potato)
SELECT DISTINCT status FROM FamilyMembers JOIN Payments ON FamilyMembers.member_id=Payments.family_member JOIN Goods ON Payments.good=Goods.good_id WHERE good_name = 'potato';
Задание 20. Сколько и кто из семьи потратил на развлечения (entertainment). Вывести статус в семье, имя, сумму
SELECT fm.status, fm.member_name, SUM(p.amount*p.unit_price) AS costs FROM FamilyMembers AS fm JOIN Payments AS p ON fm.member_id=p.family_member JOIN Goods AS g ON p.good=g.good_id JOIN GoodTypes AS gt ON g.type=gt.good_type_id WHERE good_type_name = 'entertainment' GROUP BY fm.status, fm.member_name;
Задание 21. Определить товары, которые покупали более 1 раза
SELECT good_name FROM Goods JOIN Payments ON Goods.good_id=Payments.good GROUP BY good HAVING COUNT(good) > 1;
Задание 22. Найти имена всех матерей (mother)
SELECT member_name FROM FamilyMembers WHERE status = 'mother';
