2

我一直在尝试(没有成功)构建一个 MYSQL 查询,该查询将选择一组记录,其“标题”字段以单个字母字符开头,但如果它是“The”、“An”或“A”则忽略第一个单词”。我已经找到了很多针对查询的 ORDER BY 部分执行此操作的示例,但这是我需要为其执行的初始 WHERE 部分,因为如果未找到正确的记录,则顺序无关紧要。使用

WHERE title LIKE "R%"

只会给我以这个作为第一个字母的标题(例如“Robin Hood”),但不会匹配“The Red House”。我想我需要某种正则表达式,但我似乎无法让它工作。

例如,给定以下电影标题,

路屋

王者回归

妈妈咪呀

阿尔戈

泰坦尼克号

一条河流穿过它

选择以“R”开头的电影标题将返回以下内容:

王者回归

一条河流穿过它

客栈

(其他字段省略)

4

3 回答 3

5

最简单的方法是以编程方式将查询扩展为类似

SELECT
...
WHERE
  title LIKE 'R%'
  OR title LIKE 'The R%'
  OR title LIKE 'A R%'
  OR title LIKE 'An R%'
  ...

这应该比 REGEX 执行得更好,因为它将能够使用 REGEX 永远不会使用的索引。

顺便说一句:执行此操作的规范方法是将文章存储在单独的字段中。

于 2013-01-25T08:29:38.580 回答
2

此正则表达式应满足您的需求:

WHERE title REGEXP '^(The |An? )?R.*$'

但正如@EugenRieck 注意到的那样,由于您可能在title列上使用索引,因此您应该更好地使用WHERE... OR...子句。

于 2013-01-25T08:30:54.460 回答
1

要添加到上述建议(我都同意),对于排序,您可能需要使用 CASE 为 ORDER BY 子句派生一个字段。

SELECT somefield, 
CASE 
WHEN title LIKE 'R%' THEN title
WHEN title LIKE 'The R%' THEN SUBSTRING(title FROM 5)
WHEN title LIKE 'A R%' THEN SUBSTRING(title FROM 3)
WHEN title LIKE 'An R%' THEN SUBSTRING(title FROM 4)
ELSE title
END AS SortTitle
FROM sometable
ORDER BY SortTitle
于 2013-01-25T09:32:43.603 回答