2016-06-11 5 views
0

У меня есть 2 стола: стопы и bus_route_details.Как я могу получить id, min и max в одном и том же запросе My SQL?

stop_id stop_name 
     1 ‘C’ CROSS ROAD JUNCTION 
     2 10TH ROAD 
     3 16TH ROAD 
     4 4TH ROAD (GOLIBAR) 
     5 600TENAMENTGATE 
     6 A.D.MODI INSTITUTE 
     7 AHANSARI CHOWK 
     8 A.H.SCHOOL 
     9 A.P.M.COMPLEX 
    10 A.T.I. 
    11 AAI TULJABHAVANI CHOWK/LOKHANDWALA COMPLEX 
    12 AAKASH GANGA SOCIETY (DHARAVI) 

Стол останавливается, просто сохраняет идентификатор и имя каждой остановки. В таблице bus_route_details хранится идентификатор bus_number, stop_id остановки из таблицы остановок и порядок, в котором остановка появляется на этом маршруте. Первая остановка имеет порядок 1, тогда как последняя остановка может быть числом, равным 44, если в маршруте всего 44 остановки.

bus_number stop_id stop_order 
     8 2139   30 
     8  351   31 
     8 1791   32 
     8  19   33 
     8  2   34 
     8  497   35 
     8 2024   36 
     8  20   37 
     8  404   38 
     8 1787   39 
     8  621   40 
     8 1937   41 
     8 1941   42 
     7  509   1 
     7  788   2 
     7  996   3 
     7 1340   4 
     7 1161   5 
     7  335   6 
     7 2296   7 
     7  891   8 

Как указано выше, я хотел бы получить таблицу, которая показывает, где начинается и заканчивается номер 7 и 8 шины. Простыми словами, получите отдельный список номеров шин, найдите стоп, минимальный стоп-ордер и максимальный стоп-ордер для каждой шины.

7, начало, конец [Это, как я хочу, номера автобусов и остановки имена]

Мой текущий запрос только дает мне 2 колонки: либо начальный или конечный stop_name. Как я могу получить все 3 столбца в одном запросе?

SELECT bus_number, stop_name from bus_route_details, stops `WHERE(bus_number, stop_order) IN (SELECT bus_number, MAX(stop_order)` 
FROM bus_route_details 
GROUP BY bus_number) 
AND stops.stop_id = bus_route_details.stop_id 

Любые предложения? Я сделал UNION и получил все 4 результата успешно в 2 столбцах, но мне бы хотелось, чтобы это было 3 столбца. Спасибо

ответ

1

Один из способов сделать это, чтобы найти минимальное и максимальное в производной таблице и присоединиться к таблице останавливается, и, наконец, использовать условную агрегацию для выравнивания результата, как это:

select 
    b.Bus_number, 
    max(case when b.stop_order = x.mio then b.stop_id end) min_stop_id, 
    max(case when b.stop_order = x.mio then s.stop_name end) min_stop_name, 
    max(case when b.stop_order = x.mao then b.stop_id end) max_stop_id, 
    max(case when b.stop_order = x.mao then s.stop_name end) max_stop_name 
from bus_route_details b 
join (
    select Bus_number, min(stop_order) mio, max(stop_order) mao 
    from bus_route_details 
    group by Bus_number 
) x on b.Bus_number = x.Bus_number and (b.stop_order = x.mio or b.stop_order = x.mao) 
join stops s on b.stop_id = s.stop_id or b.stop_id = s.stop_id 
group by b.Bus_number; 

Это даст вам результат, как:

Bus_number min_stop_id min_stop_name  max_stop_id max_stop_name 
----------- ----------- -------------------- ----------- -------------------- 
7   509   stop 1    891   stop 2 
8   351   stop 3    1941  stop 4 
0

Использование двойного внутреннего соединения на стопах

select b.stop_name as name_start, c.stop_name as finish_name 
    from 
    (SELECT bus_number, min(stop_order) as start_id, max(stop_order) as finish_id 
    from bus_route_details 
    group by bus_number) as t 
    inner join bus_route_details as b on t.start_id = b.stop_id 
    inner join bus_route_details as c on t.finish_id = c.stop_id 
+0

Даже если вы объявили bus_route_details как b в предложении внутреннего соединения, он выдает ошибку в phpmyadmin, говоря Неизвестный столбец «b.stop_name» в «списке полей» – PirateApp

+0

У меня есть ответ. – scaisEdge