如何在MySQL中按标题排序,忽略单词“the”?

8
我有一份电影列表,按字母分组。自然而然,以字母“T”开头的电影中大约80%是以“the”开头的电影。例如,“The Dark Knight”应该出现在“D”列表中,并最好也出现在“T”列表中。有没有什么办法可以做到这一点?
我在WHERE子句中使用以下代码显示以某个字母开头的电影,忽略“the”,但这也有一个方便的副作用,即使像“ The Dark Knight”这样的电影也会出现在字母“D”和“T”的列表中。
WHERE movie_title REGEXP CONCAT('^(the )?', '$letter')

当我输出数据库中所有电影时,我希望能够实现这一点。

1
为了增加难度:以数字开头的标题(如“101只小狗”)应该按照数字拼写的方式进行排序。在这种情况下,它应该被归类到“O”下面。 - Barry Brown
6个回答

17
如果您经常执行此查询,您将希望在表中创建一个名为“sorted”的单独字段。使用正则表达式或其他操作会使MySQL无法利用索引。
因此,最简单和最有效的解决方案是添加一个名为“movie_title_short”的字段,其中包含不带“The”或“A”的“movie_title”。确保还为“movie_title_short”字段添加索引!

是的,我考虑过这个问题,但它不会被频繁执行。 - user15063
存储空间比CPU时间便宜。只需使用一个title_order字段,因为您无疑也想按相同的标准排序。 - cletus
啊,我明白了。是的,那么进行联合操作应该能够实现最佳结果。 - carl
“Union”?为什么不直接用“OR”语句呢? - ashawley
“the”或“a”或“an”,顺便说一下,不仅仅是“the”或“a”。 - AmbroseChapel
显示剩余3条评论

6

正如Carl所说,我会将其构建为可索引的字段,以避免每次计算。不过,我建议采用稍微不同的方式来避免冗余。

movies (id, name, namePrefix)

例如:

| Dark Knight        | The |
| Affair To Remember | An  |
| Beautiful Mind     | A   |

这样,您可以用两种不同的方式展示这些电影:"名称,名称前缀""名称前缀 名称",并且可以进行相应的排序。

有没有人知道是否有一个规范的单词列表,可以在排序时去掉标题,例如"The"、"An"和"A"。此外,还有关于大写的规则:应该是"An Affair To Remember"还是"An Affair to Remember"? - Evan

1

我自己也遇到了这个问题...解决方案是:

SELECT * FROM movies WHERE title REGEXP '^d' AND title NOT REGEXP '^the ' OR title REGEXP '^the d'

这样做将只返回以"The D"或"D"开头的结果


1
select right(movie_title, char_length(movie_title)-4) as movie_title
from movies 
where left(movie_title,3) = 'the'
union
select movie_title
from movies

1

您可以在select子句中使用mysql的replace函数...

 select replace(movie_title,'The ','') from ... order by replace(movie_title,'The ','')'

不,他希望“the”电影在全部放在一起时出现两次 - 有和没有“the”。 - GSerg
如果使用相同的WHERE子句,它会这样做。你能减去1个注释吗? :) - ashawley

0

使用这个:

SELECT * FROM movies ORDER BY TRIM(LEADING 'the ' FROM LOWER(`movie_title`));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接