我试图在MySQL中实现自然/字母数字排序并且没有运气。我已经阅读了几篇关于我在谷歌搜索中发现的主题的文章和各种文章。这是我开始的基本查询:
select VideoTitle, VideoID
from Filters
where VideoSource = 'Netflix'
and IMDBSeries = 'tt0367279'
and PublishDate is not null
ORDER BY VideoTitle
该查询产生此结果集:
Arrested Development Season 1: Ep. 1 Pilot Arrested Development Season 1: Ep. 10 Pier Pressure Arrested Development Season 1: Ep. 2 Top Banana Arrested Development Season 1: Ep. 3 Bringing Up Buster Arrested Development Season 1: Ep. 4 Key Decisions Arrested Development Season 1: Ep. 5 Charity Drive Arrested Development Season 1: Ep. 6 Visiting Ours Arrested Development Season 1: Ep. 7 In God We Trust Arrested Development Season 1: Ep. 8 My Mother, the Car Arrested Development Season 1: Ep. 9 Storming the Castle
请注意,从自然排序的角度来看,这一行是乱序的:
被捕发展第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
Arrested Development Season 1: Ep. 1 Pilot Arrested Development Season 1: Ep. 10 Pier Pressure Arrested Development Season 1: Ep. 2 Top Banana Arrested Development Season 1: Ep. 3 Bringing Up Buster Arrested Development Season 1: Ep. 4 Key Decisions Arrested Development Season 1: Ep. 5 Charity Drive Arrested Development Season 1: Ep. 6 Visiting Ours Arrested Development Season 1: Ep. 7 In God We Trust Arrested Development Season 1: Ep. 8 My Mother, the Car Arrested Development Season 1: Ep. 9 Storming the Castle
select VideoTitle
from Filters
where VideoSource = 'Netflix'
and IMDBSeries = 'tt0367279'
and PublishDate is not null
ORDER BY LENGTH(VideoTitle), VideoTitle
Arrested Development Season 1: Ep. 1 Pilot Arrested Development Season 1: Ep. 2 Top Banana Arrested Development Season 1: Ep. 4 Key Decisions Arrested Development Season 1: Ep. 5 Charity Drive Arrested Development Season 1: Ep. 6 Visiting Ours Arrested Development Season 1: Ep. 10 Pier Pressure Arrested Development Season 1: Ep. 7 In God We Trust Arrested Development Season 1: Ep. 3 Bringing Up Buster Arrested Development Season 1: Ep. 8 My Mother, the Car Arrested Development Season 1: Ep. 9 Storming the Castle
select VideoTitle
from Filters
where VideoSource = 'Netflix'
and IMDBSeries = 'tt0367279'
and PublishDate is not null
ORDER BY VideoTitle + 0 ASC
Arrested Development Season 1: Ep. 1 Pilot Arrested Development Season 1: Ep. 9 Storming the Castle Arrested Development Season 1: Ep. 8 My Mother, the Car Arrested Development Season 1: Ep. 7 In God We Trust Arrested Development Season 1: Ep. 6 Visiting Ours Arrested Development Season 1: Ep. 5 Charity Drive Arrested Development Season 1: Ep. 4 Key Decisions Arrested Development Season 1: Ep. 3 Bringing Up Buster Arrested Development Season 1: Ep. 2 Top Banana Arrested Development Season 1: Ep. 10 Pier Pressure
有什么想法吗?
答案 0 :(得分:2)
最佳解决方案是将节目标题,季节,剧集编号和剧集标题存储在不同的列中。
在这种情况下,您可以进行一些字符串操作以获得所需的内容。
ORDER BY SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(VideoTitle, ': ', -1), ' ', 2), ' ', -1)+0
但这是一个非常脆弱的解决方案。
答案 1 :(得分:1)
如果你真的想要,你可以逐件排序:
order by substring_index(VideoTitle, ' Season ', 1),
substring_index(VideoTitle, ' Season ', -1) + 0,
substring_index(VideoTitle, ': Ep. ', -1) + 0
这假设字符串' Season '
和: Ep.
仅在每个标题中出现一次。
以下版本也应该非常接近,假设季节只有一位数:
order by substring_index(VideoTitle, ': Ep. ', 1),
substring_index(VideoTitle, ': Ep. ', -1) + 0
答案 2 :(得分:1)
如果要创建新的列以使您的模型更易于搜索,我会采用更优雅的解决方案,而不是逐个分解字符串。
select VideoTitle
from (select VideoTitle,
VideoTitle REGEXP '.+Ep\\. [0-9]{2}.+' vd2dig
from videos
) sub
order by vd2dig, VideoTitle;
当VideoTitle
有两位数时,这基本上会1
,当它有一位数时,它会0
,所以我先按此列排序,然后按{{{} { 1}}