如何在同一个 My SQL 查询中获取 id、min 和 max?
How can I get the id, min and max in the same My SQL query?
我有 2 个 tables:停止和 bus_route_details。
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)
table 停靠站简单地存储每个停靠站的 ID 和名称。 bus_route_details table 存储 bus_number、stop_id 与停靠点 table 之间的停靠点以及停靠点在该路线上出现的顺序。第一站的顺序为 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
根据上述内容,我想要一个 table 显示 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 列。谢谢
在停靠点上使用双内连接
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
这样做的一种方法是在派生的 table 中找到最小值和最大值并加入停靠点 table 最后使用条件聚合来展平结果,如下所示:
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
我有 2 个 tables:停止和 bus_route_details。
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)
table 停靠站简单地存储每个停靠站的 ID 和名称。 bus_route_details table 存储 bus_number、stop_id 与停靠点 table 之间的停靠点以及停靠点在该路线上出现的顺序。第一站的顺序为 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
根据上述内容,我想要一个 table 显示 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 列。谢谢
在停靠点上使用双内连接
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
这样做的一种方法是在派生的 table 中找到最小值和最大值并加入停靠点 table 最后使用条件聚合来展平结果,如下所示:
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