 
 
 
 
 
 
Запрос: 
Cписок остановок, которые находятся на заданных маршрутах и автобусы, которых на них останавливаются. 
 
Пояснения: 
1) Остановки должны находиться хотя бы на одном из заданных маршрутов. 
2) Выведенные автобусы должны находиться на этих же маршрутах (можно вывести и все автобусы на остановках, а не только на этих маршрутах) . 
3) Использовать только кореллированные подзапросы. Нельзя использовать JOIN, точки и т. д. 
Вот мой максимум: 
 
select stop, bus 
from 
 ( 
 select 
 n_bus as bus, 
 (select name_stop from stops) as stop, 
 (select n_route from routes) as route 
 from buses 
 where 
 (id_r in (select id from routes)) 
 and 
 (id_r in (select id_r from rs where id_s in (select id from stops))) 
 ) as bsr 
where (route = 32) or (route = 71) 
 
Выдаёт ошибку: 
Lookup Error - MySQL Database Error: Subquery returns more than 1 row 
Прошу помочь составить запрос и понять, что значит данная ошибка. Заранее благодарен.
		
		
								
				> понять, что значит данная ошибка 
 
Эта ошибка означает, что в выражении 
 
(select name_stop from stops) as stop 
 
запрос должен возвращать только одну запись, ведь это значение поля, в которое засунуть набор записей невозможно. То же самое и с выражением 
 
(select n_route from routes) as route 
> Прошу помочь составить запрос 
 
Не совсем понятно, что имеется в виду под "Использовать только кореллированные подзапросы". Без связи между автобусами и остановками мы получим в лучшем случае декартово произведение множеств автобусов и остановок, которые имеют отношение к заданным маршрутам. Вряд ли это то, что требуется. 
 
Ну а со связью можно сделать так: 
 
SELECT stops.name_stop as stop, buses.n_bus as bus 
FROM stops, buses, (SELECT id_r, id_s FROM [r-s] WHERE id_r IN 
(SELECT id FROM routes WHERE n_route IN (32, 71))) as rs 
WHERE stops.id = rs.id_s AND buses.id_r = rs.id_r; 
 
Последнее условие WHERE как раз и задаёт связь между автобусами и остановками. 
 
Но в таком варианте отсутствуют остановки, на которых не останавливается ни один автобус. Чтобы их учесть, надо использовать UNION. Чтобы не повторять условие на маршруты, изменим первоначальный запрос: 
 
SELECT stop, bus 
FROM 
(SELECT rs.id_r, stops.name_stop as stop, buses.n_bus as bus 
FROM [r-s] as rs, stops, buses 
WHERE stops.id = rs.id_s AND buses.id_r = rs.id_r) 
WHERE id_r IN (SELECT id FROM routes WHERE n_route IN (32, 71)); 
 
Теперь добавим те записи, для которых отсутствует автобус на данном маршруте: 
 
SELECT stop, bus 
FROM 
(SELECT rs.id_r, stops.name_stop as stop, buses.n_bus as bus 
FROM [r-s] as rs, stops, buses 
WHERE stops.id = rs.id_s AND buses.id_r = rs.id_r 
UNION 
SELECT rs.id_r, stops.name_stop as stop, NULL as bus 
FROM [r-s] as rs, stops 
WHERE stops.id=rs.id_s AND NOT EXISTS (SELECT id FROM buses WHERE id_r=rs.id_r)) 
WHERE id_r IN (SELECT id FROM routes WHERE n_route IN (32, 71));