自定义ORDER BY忽略'the'

dim*_*414 15 mysql sql sorting

我正在尝试对标题列表进行排序,但目前有一大块标题以"The"开头.我希望忽略'The',以及解决第二个词的问题.这可能在SQL中,还是我必须在前端进行自定义工作?

例如,当前排序:

  • 飞机
  • 男人的孩子
  • 全金属外壳
  • 低俗小说
  • 喷泉
  • 大逃亡
  • 皇后
  • Zardoz

会更好地排序:

  • 飞机
  • 男人的孩子
  • 喷泉
  • 全金属外壳
  • 大逃亡
  • 低俗小说
  • 皇后
  • Zardoz

几乎就像记录存储为'Fountain,The'等.但是,如果可以的话,我不想以那种方式存储它们,这当然是问题的症结所在.

Rob*_*ley 12

最好是有一个计算列来执行此操作,以便您可以索引计算列并按此顺序.否则,排序将是很多工作.

那么你可以将你的计算列作为:

CASE WHEN title LIKE 'The %' THEN stuff(title,1,4,'') + ', The' ELSE title END
Run Code Online (Sandbox Code Playgroud)

编辑:如果MySQL中没有STUFF,则使用RIGHT或SUBSTRING删除前4个字符.但是如果可能的话,仍然尝试使用计算列,以便索引可以更好.同样的逻辑应适用于撕掉"A"和"An".

  • 您可能还希望在排序列中将其全部设为小写,以获得不区分大小写的排序(和搜索) (2认同)

gre*_*ama 9

就像是:

ORDER BY IF(LEFT(title,2) = "A ",
            SUBSTRING(title FROM 3),
            IF(LEFT(title,3) = "An ",
              SUBSTRING(title FROM 4),
              IF(LEFT(title,4) = "The ",
                 SUBSTRING(title FROM 5),
                 title)))
Run Code Online (Sandbox Code Playgroud)

但考虑到执行此操作的开销超过几次,您最好将标题排序值存储在另一列中...


Mus*_*sis 5

我想你可以做类似的事情

ORDER BY REPLACE(TITLE, 'The ', '')
Run Code Online (Sandbox Code Playgroud)

尽管这会将任何出现的 'The' 替换为 '',而不仅仅是第一个 'The',尽管我认为这不会有太大影响。