假设我有一张电影桌。电影的名称是varchar。但有时电影名称包含超过9的续集(或系列或剧集)数字。如何对电影名称进行排序以处理像人类一样的数字?
这是默认排序方式:
select * from movies order by name
Alpha
Beta
Gamma 1
Gamma 10
Gamma 2
Gamma 3
Gamma 4
Gamma 5
Gamma 6
Gamma 7
Gamma 8
Gamma 9
Delta
看到1后的10?我知道为什么会这样做,我想知道的是如何让它像这样:
Alpha
Beta
Gamma 1
Gamma 2
Gamma 3
Gamma 4
Gamma 5
Gamma 6
Gamma 7
Gamma 8
Gamma 9
Gamma 10
Delta
我一直在寻找解决方案,但没有找到任何可以解决这个问题的方法。
请注意,这只是一个简单的示例,实际名称可能更加复杂,例如Gamma The Explorer 1. episode
或Gamma The Explorer 2. series 1. episode
或Gamma The Explorer 3. episode Director's Cut
,而且大多数其他电影名称都没有其中的数字,所以请不要使用name+0
计算字符串中特定位置或位置的数字或排序的解决方案 - 这不是我想要的解决方案。
我知道有一个事实,Windows资源管理器,以及其他软件,以正确的(人类)方式处理文件名称排序,我不相信MySQL将无法处理如此明显的东西,所以应该是一个可行的解决方案。
编辑:显然它被称为自然排序。 MySQL根本没有这个吗?可选:什么是UDF,我在哪里获得自然排序,以及如何在我的服务器上获取它?
答案 0 :(得分:0)
SELECT movies.*,
SUBSTRING_INDEX(name, ' ', 1) AS name_str,
SUBSTRING_INDEX(name, ' ', -1) + 0 AS name_num
FROM movies
ORDER BY name_str, name_num