在MySQL中尝试自然排序失败

在MySQL中尝试自然排序失败,mysql,sql-order-by,natural-sort,Mysql,Sql Order By,Natural Sort,我试图在MySQL中实现自然/字母数字排序,但运气不好。我已经阅读了几篇关于我在谷歌搜索中找到的主题的堆叠文章和各种文章。以下是我开始的基本查询: select VideoTitle, VideoID from Filters where VideoSource = 'Netflix' and IMDBSeries = 'tt0367279' and PublishDate is not null ORDER BY VideoTitle 该查询将生成以下结果集: 请注意,从自然排序的角度来看,

我试图在MySQL中实现自然/字母数字排序,但运气不好。我已经阅读了几篇关于我在谷歌搜索中找到的主题的堆叠文章和各种文章。以下是我开始的基本查询:

select VideoTitle, VideoID
from Filters
where VideoSource = 'Netflix'
and IMDBSeries = 'tt0367279'
and PublishDate is not null
ORDER BY VideoTitle
该查询将生成以下结果集:

请注意,从自然排序的角度来看,此行的顺序不正确:

第1季:Ep。10桥墩压力

根据我读到的帖子/文章,我还尝试了以下方法,以及相应的结果集:

select VideoTitle
from Filters
where VideoSource = 'Netflix'
and IMDBSeries = 'tt0367279'
and PublishDate is not null
ORDER BY CAST(VideoTitle AS UNSIGNED), VideoTitle



有什么想法吗?

如果你真的想,你可以按件排序:

order by substring_index(VideoTitle, ' Season ', 1),
         substring_index(VideoTitle, ' Season ', -1) + 0,
         substring_index(VideoTitle, ': Ep. ', -1) + 0
这假设字符串
'seasure'
:Ep.
在每个标题中只出现一次

假设季节只有一个数字,以下版本也应该非常接近:

order by substring_index(VideoTitle, ': Ep. ', 1),
         substring_index(VideoTitle, ': Ep. ', -1) + 0

如果您确实需要,可以按件对其进行排序:

order by substring_index(VideoTitle, ' Season ', 1),
         substring_index(VideoTitle, ' Season ', -1) + 0,
         substring_index(VideoTitle, ': Ep. ', -1) + 0
这假设字符串
'seasure'
:Ep.
在每个标题中只出现一次

假设季节只有一个数字,以下版本也应该非常接近:

order by substring_index(VideoTitle, ': Ep. ', 1),
         substring_index(VideoTitle, ': Ep. ', -1) + 0

最好的解决方案是将节目标题、季节、剧集编号和剧集标题存储在单独的列中

在本例中,您可能能够执行一些字符串操作以获得所需的内容

ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(VideoTitle, ': ', -1), ' ', 2), ' ', -1)+0 

不过,这是一个非常脆弱的解决方案。

最好的解决方案是将节目标题、季节、剧集编号和剧集标题存储在单独的列中

在本例中,您可能能够执行一些字符串操作以获得所需的内容

ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(VideoTitle, ': ', -1), ' ', 2), ' ', -1)+0 

不过,这是一个非常脆弱的解决方案。

如果创建新的列以使您的模型更好地进行搜索,我会选择一个更优雅的解决方案,而不是将字符串分解成碎片

select VideoTitle 
  from (select VideoTitle, 
               VideoTitle REGEXP '.+Ep\\. [0-9]{2}.+' vd2dig 
          from videos
       ) sub
 order by vd2dig, VideoTitle; 
这将基本上使
VideoTitle
成为
1
的两个数字,当它有一个数字时,它将成为
0
,因此我先按此列排序,然后是
VideoTitle


在这里查看它的工作情况:

如果创建新的列以使您的模型更好地进行搜索,我会选择一个更优雅的解决方案,而不是将字符串分解成碎片

select VideoTitle 
  from (select VideoTitle, 
               VideoTitle REGEXP '.+Ep\\. [0-9]{2}.+' vd2dig 
          from videos
       ) sub
 order by vd2dig, VideoTitle; 
这将基本上使
VideoTitle
成为
1
的两个数字,当它有一个数字时,它将成为
0
,因此我先按此列排序,然后是
VideoTitle


看到它在这里工作了吗:

哪一个是您的mysql版本?我建议您在数据库中再添加两个INT列,即seasure和epNumber。它会在一次心跳中解决你所有的问题。谢谢你,乔治。你说得对,我会看看我能做些什么。哪一个是你的mysql版本?我建议你在数据库中再添加两个INT列,season和epNumber。它会在一次心跳中解决你所有的问题。谢谢你,乔治。你说得对,我看看我能做些什么。谢谢你,比尔。工作完美。我会看看是否可以添加一些列,并在DB级别上做得更好。谢谢比尔。工作完美。我会看看是否可以添加一些列,并在DB级别上做得更好。感谢Jorge提出的深思熟虑的解决方案。感谢Jorge提出的深思熟虑的解决方案。感谢Gordon提出的深思熟虑的解决方案。感谢Gordon提出的深思熟虑的解决方案。
ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(VideoTitle, ': ', -1), ' ', 2), ' ', -1)+0 
select VideoTitle 
  from (select VideoTitle, 
               VideoTitle REGEXP '.+Ep\\. [0-9]{2}.+' vd2dig 
          from videos
       ) sub
 order by vd2dig, VideoTitle;