我正在努力在MYSQL中构建一个查询,通过它我可以搜索表中的firstName和lastName列,这些列可以返回几乎匹配它的所有记录。
就像我想搜索一个名字一样, Aditya Kumar Sharma ,我的桌子包含这样的内容:
ID firstName lastName
1 Jack Mathews
2 Aditya Singh
3 James Hopes
4 Aditya Kumar Sharma
5 Adityahappy Singh
现在我想要在firstName和lastName列中包含任何 Aditya 或 Kumar 或 Sharma 的所有记录,这意味着我需要跟随我的结果集中的记录:
ID firstName lastName
2 Aditya Singh
4 Aditya Kumar Sharma
5 Adityahappy Singh
任何人都可以提供一些线索,如何完成它。如果最匹配的记录排在最前面,那将更令人愉快,那就是:
ID firstName lastName
4 Aditya Kumar Sharma
位于结果集之上,因为它与查询字符串完全匹配。
编辑:我正在为我的数据库使用InnoDB引擎,因此FullText不能解决这个问题,有没有其他方法或我被迫切换我的数据库引擎?
答案 0 :(得分:2)
我认为FULLTEXT
搜索会有效
SELECT *,
MATCH ( `FirstName`, `Lastname`)
AGAINST ('+name +middle_name +lastname' IN BOOLEAN MODE) as `rel`
FROM `table`
WHERE MATCH ( `FirstName`, `Lastname`)
AGAINST ('+name +middle_name +lastname' IN BOOLEAN MODE)
ORDER BY `rel` DESC
答案 1 :(得分:1)
您应该尝试一个可以帮助您的MySQL FULLTEXT search。如果你在firstName和lastName上添加一个FULLTEXT索引,你可以像这样查询它:
SELECT *,MATCH(fullNameIndex) AGAINST ('search term') AS relevance
FROM `table`
ORDER BY relevance DESC
它甚至应该首先给你最好的匹配。
答案 2 :(得分:1)
字符串函数SOUNDEX
将字符串转换为声音代码(可用于生成口语单词)。
示例:
mysql> select soundex('text'), soundex('test');
+-----------------+-----------------+
| soundex('text') | soundex('test') |
+-----------------+-----------------+
| T230 | T230 |
+-----------------+-----------------+
您可以使用此函数的结果来比较字符串
答案 3 :(得分:1)
您必须使用MySQL全文搜索内置功能。 有关示例的说明,请参阅here。 试试这个查询。
如果您使用的是MyISAM Engine。
SELECT *FROM Emps
WHERE MATCH(firstName,lastName) AGAINST ('Aditya Kumar Sharma' IN BOOLEAN MODE)
答案 4 :(得分:0)
http://en.wikipedia.org/wiki/Levenshtein_distance
一旦识别出类似的大型数据文件中的地址,我就会非常有效地使用它。我们还将其转换为匹配名称并获得了可观的结果。