MySQL在列的最后5个字符内搜索?
“我的用户”表有一列“名称”,其中包含以下信息:MySQL在列的最后5个字符内搜索?,mysql,search,substring,Mysql,Search,Substring,“我的用户”表有一列“名称”,其中包含以下信息: Joe Lee Angela White 我想高效地搜索名字或姓氏。名字很简单,我能做到 SELECT * FROM user WHERE name LIKE "ABC%" 但如果我知道姓氏的话 SELECT * FROM user WHERE name LIKE "%ABC" 这将是非常缓慢的 所以我考虑计算输入的字符数,例如,“ABC”有3个字符,如果我能在name列中只搜索最后三个字符,那就太好了。所以我想要像这样的东西 SELECT
Joe Lee
Angela White
我想高效地搜索名字或姓氏。名字很简单,我能做到
SELECT * FROM user WHERE name LIKE "ABC%"
但如果我知道姓氏的话
SELECT * FROM user WHERE name LIKE "%ABC"
这将是非常缓慢的
所以我考虑计算输入的字符数,例如,“ABC”有3个字符,如果我能在name列中只搜索最后三个字符,那就太好了。所以我想要像这样的东西
SELECT * FROM user WHERE substring(name, end-3, end) LIKE "ABC%"
MySQL中有什么东西可以做到这一点吗
非常感谢
另外,我不能做全文,因为我们的搜索引擎不支持这一点。你很接近了。在MySQL中,您应该能够使用
InStr(str,substr)
和Right(str,index)
执行以下操作:
SELECT * FROM user WHERE Right(name, InStr(name, " ")) LIKE "ABC%"
InStr(name,”)
返回空格字符的索引(您可能需要使用”
语法)。然后在Right()
函数中使用此索引只搜索姓氏(基本上,当您有多个姓名、多个空格等时会出现问题)<代码>如“ABC%”将搜索以ABC开头的姓氏
不能使用固定索引,因为长度超过3个或少于3个字符的名称将无法按照您的建议正确返回
但是,正如Zane所说,使用单独的字段是一种更好的做法。您可以使用REGEXP操作符:
SELECT * FROM user WHERE name REGEXP "ABC$"
如果它是MyIsam表,您可以使用自由文本搜索来执行相同的操作。原因如下:
WHERE name LIKE '%ith'
用姓氏查找“约翰·史密斯”是一种缓慢的方式,原因与此相同
WHERE Right(name, InStr(name, ' ' )) LIKE 'smi%'
或者列上的任何其他表达式都很慢。它不再使用索引进行快速查找,而是让MySQL服务器执行完整表扫描或完整索引扫描
如果您使用的是Oracle(也就是说,如果您为以前富有的雇主工作),那么您可以使用函数索引。因为它是你必须添加一些额外的列或一些其他帮助数据来加速你的搜索
你最聪明的做法是把你的名字和姓氏分开列。其他一些人也指出了这样做的理由
如果您不能这样做,您可以尝试创建一个额外的列,其中包含反向的名称字符串,并在该列上创建一个索引。例如,该列将“John Smith”存储为“htimS nhoJ”。然后您可以按如下方式搜索
WHERE nameReversed LIKE CONCAT(REVERSE('ith'),'%')
此搜索将使用索引,速度相当快。我在这方面做得很成功。如果你要搜索名字和姓氏,你真的应该把它们放在各自独立的列中,然后你可以在它们上面放一个复合索引。函数索引的一个例子是Oracle@ZaneBien谢谢但我现在不能这么做,因为那时我们将不得不重写整个程序…这将返回任何一个名为ABC的人。。。不是吗?问题只涉及姓氏。不,它将匹配以ABC结尾的任何内容。这与喜欢“%ABC”没有什么不同。赞恩的建议更好。会不会像做“ABC”一样慢?谢谢!我想我可以先得到输入字符串的长度,然后做正确的操作(str,index)来避免多个空格的问题,对吗?遗憾的是,事实并非如此。它不支持全文搜索。哇,反向列是个好主意!!!我一直在考虑分隔列,但不知道如何处理包含多个空格的名称。我现在将尝试构建反向柱。谢谢你知道,点击复选框“接受”对你有用的答案是可以的。倒车愉快!啊哈,我不知道……我是这里的新手:)谢谢你让我知道!