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

具有结果特殊排序的SQL查询,sql,mysql,sql-order-by,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 r

我有一个表,有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
如果数据按照停止的顺序输入到表中,它就会工作。 如果不是,则按输入的顺序返回数据。

使用此选项可以:

(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)
编辑:添加了忘记的括号。

使用此选项可以:

(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)

编辑:添加了忘记的括号。

您可以在一个查询中执行此操作,通过使用case语句保存表访问

select * from routes
where route = 'Red'
order by case when stop_order >= 3 then 0 else 1 end, stop_order
;

更正

您可以在一个查询中使用case语句保存对表的访问

select * from routes
where route = 'Red'
order by case when stop_order >= 3 then 0 else 1 end, stop_order
;

更正

尝试对这两条sql语句按停止顺序排序。默认情况下,order By将按升序对结果进行排序

尝试按停止顺序对两条sql语句进行排序。默认情况下,order By将按升序对结果排序

我想Patrick差不多做到了:

(SELECT * FROM routes WHERE stop_order >= 5 ORDER BY stop_order)
UNION ALL
(SELECT * FROM routes WHERE stop_order < 5 ORDER BY stop_order)

我想Patrick差点成功了:

(SELECT * FROM routes WHERE stop_order >= 5 ORDER BY stop_order)
UNION ALL
(SELECT * FROM routes WHERE stop_order < 5 ORDER BY stop_order)

对于所问的问题,答案是正确的。但是,我希望进一步优化代码,并使其能够在查询中使用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方面有问题的人。

a'r的答案对于所问的问题是正确的。但是,我希望进一步优化代码,并使其能够在查询中使用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方面有问题的人。

如果你只是在联合中的每个查询中添加“按停止顺序排序”怎么办?另外,如果你要使用联合,你希望在这里都使用联合。如果你只是在联合中的每个查询中添加“按停止顺序排序”怎么办?还有,如果你要使用联合,您希望在此处使用UNION ALL.SQL通常只允许一个ORDER BY,对于UNION后的整个结果集,我得到1221-UNION和ORDER BY的用法不正确当我尝试时SQL通常只允许一个ORDER BY,对于UNION之后的整个结果集,我得到1221-尝试使用时UNION和ORDER BY的用法不正确,这只是返回从第一站开始按ID排序的结果。如果stop\u ORDER>=5,则stop\u ORDER-100,否则stop\u ORDER如何?抱歉,我现在已更新查询。案例陈述允许我们根据其在当前站点之后或之前的顺序进行排序,然后再恢复到站点编号的自然顺序。正确答案无需工会假设公交车在兜圈子,如果stop\u order>=3,则0 else 1 end可以简单地重写为stop\u order<3。这只是返回从第一站开始的ID所排序的数据。如果stop\u order>=5,则stop\u order-100 else stop\u order,则情况如何?抱歉,我现在更新了查询。case语句允许我们在恢复到站点编号的自然顺序之前,根据其在当前站点之后或之前的顺序进行排序。正确答案无需工会假设公交车在兜圈子行驶,case当stop\u order>=3,则0 else 1 end可以简单地重写为stop\u order<3。