Mysql 如何使用前缀通配符,如'*abc&x27;与对手

Mysql 如何使用前缀通配符,如'*abc&x27;与对手,mysql,match,Mysql,Match,我有以下疑问: SELECT * FROM `user` WHERE MATCH (user_login) AGAINST ('supriya*' IN BOOLEAN MODE) 它输出以'supriya'开头的所有记录 现在,我想要一个可以找到所有以abc结尾的记录的东西,例如 我知道,*无法预先显示,它也不起作用,我搜索了很多,但找不到任何与此相关的内容 如果我给查询字符串priya。它应该返回以priya结尾的所有记录 我如何做到这一点?匹配不适用于启动通配符,因此与*abc*匹配不

我有以下疑问:

SELECT * FROM `user` 
WHERE MATCH (user_login) AGAINST ('supriya*' IN BOOLEAN MODE)
它输出以
'supriya'
开头的所有记录
现在,我想要一个可以找到所有以abc结尾的记录的东西,例如

我知道,
*
无法预先显示,它也不起作用,我搜索了很多,但找不到任何与此相关的内容

如果我给查询字符串
priya
。它应该返回以
priya
结尾的所有记录

我如何做到这一点?

匹配不适用于启动通配符,因此与
*abc*
匹配不起作用。您必须像使用
一样使用
来实现这一点:

SELECT * FROM user WHERE user_login LIKE '%abc';
然而,这将是非常缓慢的

如果您真的需要匹配字符串的结尾,并且必须经常这样做,而性能会让您疲于奔命,那么解决方案是创建一个单独的列,在其中反转字符串,这样您就得到了:

user_login user_login_rev
xyzabc     cbazyx

然后,您可以查找
'cba%
,而不是查找
'%abc'
,如果对列进行索引,则查找速度会快得多。如果您想搜索
“cba*”
,可以再次使用MATCH。您还需要反转搜索字符串。

我认为选择
全文搜索与此处无关。如果您对基于通配符搜索某些字段感兴趣,例如:

  • %word%
    (字符串中任意位置的word)
  • word%
    (以word开头)
  • %word
    (以word结尾)
最好的选择是像GolezTrol提到的那样使用
类似的
子句

但是,如果您对高级/基于文本的搜索感兴趣,则可以选择
全文搜索

类似的限制:

这一条款有一些限制。假设您使用类似于“%good”(以good结尾的任何内容)的内容。它可能返回不相关的结果,如
商品
糖果


因此,请确保您了解您正在做什么以及需要做什么。

您可以在用户登录时执行
操作,如“%priya”
,但这可能是您可以执行的最慢的查询之一。请改进您的问题标题。谢谢!!这听起来是一个很好的解决方案,但我必须在一个已经存在的数据库中实现这一点,这个数据库相当大,而反转所有现有数据将是非常乏味的。还有一点需要考虑:)如果您添加列,一次更新所有行,然后编写一个触发器来保持反向列的同步,那么应该这样做。它会占用一些额外的空间,但除此之外,它应该很容易实现。非常好的解决方案!。。但是,与像%abc%
这样的
相比,它的速度有多快?正如我在回答中所说,起始通配符会使它变慢,因为不再使用索引。实际的差异在很大程度上取决于记录的数量、值的长度、索引的质量以及可能的许多其他因素。请注意,如果您想从字符串的中间查找内容,则反转字符串将无助于您。使用普通索引键入“Blue%”或使用倒排的inices反转“Blue%”都找不到“Jimmy Blue Jones”。使用“%word”的最大限制是不能使用索引。那可能会毁了你的表演。