我有一个表格,其中有3列代表公交路线中的停靠点。
ID
stop_name
stop_order
我想要返回以当前停止(我知道)开头的停靠列表。 因此,如果当前止损位于第5位,则返回的内容如下:
stop_order
5
6
7
8
1
2
3
4
我试过了:
Select * from routes where stop_order >= 3 and route = 'Red'
Union
Select * from routes where stop_order < 3 and route = 'Red
如果数据按停靠顺序输入表中,则可以正常工作。 如果不是那么它按照输入的顺序返回数据。
答案 0 :(得分:6)
您可以在一个查询中执行此操作,以使用case语句保存表访问。
select * from routes
where route = 'Red'
order by case when stop_order >= 3 then 0 else 1 end, stop_order
;
更正!
答案 1 :(得分:0)
使用它会起作用:
(Select * from routes where stop_order >= 3 and route = 'Red' Order By ID)
Union
(Select * from routes where stop_order < 3 and route = 'Red' Order By ID)
修改:添加了遗忘的括号。
答案 2 :(得分:0)
尝试使用stop_order对两个sql语句进行排序。默认情况下,order by将按升序对结果进行排序
答案 3 :(得分:0)
我认为帕特里克几乎拥有它:
(SELECT * FROM routes WHERE stop_order >= 5 ORDER BY stop_order)
UNION ALL
(SELECT * FROM routes WHERE stop_order < 5 ORDER BY stop_order)
答案 4 :(得分:0)
答案对于提出的问题是正确的。但是,我想进一步优化代码,并且还可以在查询中使用DISTINCT,这对于给定的解决方案是不可能的。
在查看了一下后,我发现你可以将CASE WHEN语句移动到select而不是下面编码的顺序:
select distinct route, case when stop_order >= 3 then 0 else 1 end as sorted_by from routes
where route = 'Red'
order by sorted_by, stop_order
;
希望这有助于其他一些人在订购方面遇到问题并使用DISTINCT。