多列名称搜索MySQL

Bry*_*ver 2 mysql search wildcard where-clause

我目前正在进行实时搜索,我需要能够在两列中找到名称的一部分(我们需要分隔名字和姓氏).我个人希望保持命令简短,但是我能够让它工作的唯一方法是:

用户搜索

John Doe
Run Code Online (Sandbox Code Playgroud)

生成的SQL查询

SELECT * FROM users WHERE
(first_name LIKE '%john%' OR last_name LIKE '%john%') AND
(last_name LIKE '%doe%' OR last_name LIKE '%doe%');
Run Code Online (Sandbox Code Playgroud)

搜索字段是一个框,所以我做了一些简单的空格分隔.大多数情况下这不会超出三套条款,只是想知道是否有更好的方法来做到这一点.

注意: 我希望能够进行部分匹配.所以如果我找"John Do",我应该能找到John Doe

解决方案 在Rolando的帮助下,我确实提出了一个解决方案,发布给其他发现此问题的人.按照他的说明如何在下面创建索引,然后运行:

SELECT * FROM users WHERE
(MATCH(first,last) AGAINST ('+john* +do*' IN BOOLEAN MODE))
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 5

这里你最好的选择是创建一个包含两个字段的FULLTEXT索引

步骤1)创建一个只有三个单词的停用词文件

echo"a"> /var/lib/mysql/stopwords.txt
echo"an">> /var/lib/mysql/stopwords.txt
echo"the">> /var/lib/mysql/stopwords.txt

步骤2)将这些选项添加到/etc/my.cnf

ft_min_word_len = 2
ft_stopword_file =/var/lib/mysql/stopwords.txt

步骤3)在名字和姓氏列上创建FULLTEXT索引

ALTER TABLE用户ADD FULLTEXT first_last_name_index(first,last);

步骤4)在搜索中实现MATCH功能

像这样的东西:

SELECT*FROM users WHERE(MATCH(first,last)AGAINST('John'IN BOOLEAN MODE))AND(MATCH(first,last)AGAINST('Doe'IN BOOLEAN MODE));

单击此处以了解有关FULLTEXT索引的更多信息