我的用户表有一个“名称”列,其中包含以下信息:
Joe Lee
Angela White
我想有效地搜索名字或姓氏。名字很简单,我可以做到
SELECT * FROM user WHERE name LIKE "ABC%"
但是对于姓氏,如果我这样做
SELECT * FROM user WHERE name LIKE "%ABC"
那会非常慢。
所以我在考虑计算输入的字符,例如,“ABC”有3个字符,如果我只搜索名称列中的最后三个字符,那就太好了。所以我想要像
这样的东西SELECT * FROM user WHERE substring(name, end-3, end) LIKE "ABC%"
MySQL中有什么可以做到的吗?
非常感谢!
PS。我不能做全文,因为我们的搜索引擎不支持。
答案 0 :(得分:3)
原因
WHERE name LIKE '%ith'
通过姓氏寻找'John Smith'是一种缓慢的方式
WHERE Right(name, InStr(name, ' ' )) LIKE 'smi%'
或列上的任何其他表达式都很慢。它无法使用索引进行快速查找,并使MySQL服务器进行全表扫描或全索引扫描。
如果您使用的是Oracle(也就是说,如果您曾为一位以前富有的雇主工作过),您可以使用功能索引。因为它是你必须添加一些额外的列或一些其他帮助数据来加速你的搜索。
您最明智的举措是将您的名字和姓氏分成不同的列。其他几个人指出了这样做的充分理由。
如果你不能这样做,你可以尝试创建一个额外的列,其中包含反转的名称字符串,并在该列上创建索引。例如,该专栏将“John Smith”存储为“htimS nhoJ”。然后你可以搜索如下。
WHERE nameReversed LIKE CONCAT(REVERSE('ith'),'%')
此搜索将使用索引并且速度相当快。我用它取得了很大的成功。
答案 1 :(得分:0)
你很亲密。在MySQL中,您应该可以使用InStr(str, substr)
和Right(str, index)
执行以下操作:
SELECT * FROM user WHERE Right(name, InStr(name, " ")) LIKE "ABC%"
InStr(name, " ")
返回Space字符的索引(您可能必须使用" "
语法)。然后在Right()
函数中使用此索引仅搜索姓氏(基本上;当您有多个名称,多个空格等时会出现问题)。然后,LIKE "ABC%"
将搜索以ABC开头的姓氏。
您不能使用固定索引,因为长度超过3个或少于3个字符的名称将无法正常返回。
然而,正如Zane所说,使用单独的字段是一种好得多的做法。
答案 2 :(得分:0)
您可以使用REGEXP运算符:
SELECT * FROM user WHERE name REGEXP "ABC$"
答案 3 :(得分:0)
如果是MyIsam表,您可以使用自由文本搜索来执行相同操作。