具有特殊结果排序的SQL查询

时间:2010-08-02 17:04:02

标签: sql mysql sql-order-by

我有一个表格,其中有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

如果数据按停靠顺序输入表中,则可以正常工作。 如果不是那么它按照输入的顺序返回数据。

5 个答案:

答案 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。