2016-06-11 91 views
0

我有2个表格:stops和bus_route_details。如何在同一个My SQL查询中获取id,min和max?

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) 

表格停止存储每个站点的ID和名称。 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,并在2列中成功地获得了4个结果,但是我希望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