php - MySql 匹配最具体的人名

标签 php mysql

我正在 MySql 表中搜索特定人员的可能匹配项。我使用了很多其他标准,但假设我们只是在讨论给定的名称字段。

假设搜索值为 John William,表中包含 4 行名称值

John
John William 
John William Henry
John Paul 

前 3 个可能是合适的人选。我希望搜索返回与我的姓名最匹配的一个,在本例中为第 2 行。

原始代码首先使用提供的完整名称执行完全匹配查询。如果没有返回任何记录,则会使用所有末尾带有 % 的名称执行 LIKE 查询。如果失败,则仅对名字进行精确搜索。在上面的示例中,第一个查询返回记录 2,这是所需的,因此其他查询不会运行。

问题是,如果搜索名称是 John William Henry George,您可能需要执行大约 5 次查询才能逐渐使搜索变得不那么具体。另一个问题是搜索值可能是 John W 并且文件可能包含我想要匹配的 John William。反之亦然。

是否有某种方法可以执行单个查询来返回最接近的匹配项?换句话说,在上面的示例中将仅返回第 2 行。

按照最适合的顺序,我认为搜索 John William Henry 应该匹配:

John William Henry
John William Henry %
John William H
John William H %
John W H
John W H %
John W
John

请注意,John W 后面没有 %,因为这将匹配 John W B,而 John W B 不可能是正确的人选。

好的,新想法试图提高效率。是否可以通过中间的一些 PHP 代码来查询上一个查询的结果。我预计不会。伪代码如下:

$coarse = Mysql search for John%
$count = mysql_num_rows($coarse);
if ($count == 1) { 
   $rec = mysql_fetch_row($coarse);
   return $rec[0];
} 
// Assume that produced 50 records. Now want to search within those only instead of millions

$fine = Mysql search within $coarse results for John William% 
$count = mysql_num_rows($fine);
if ($count == 1) { 
   $rec = mysql_fetch_row($fine);
   return $rec[0];
} 

我显然可以在 PHP 中进行精细搜索,但是是否可以在 SQL 中进行,或者我可以使用存储过程来完成上述操作吗?

最佳答案

我会创建一个存储过程。使用 IF ELSE,检查是否存在,然后使用 NOT IN 排除查询 1 的条目。

注意:ANSI SQL 中有一个 EXCEPT 运算符,但 MySQL 不支持它,因此您可以使用 NOT IN 来排除查询 1 的行。

另外,不要在数据库/SQL 中放入太多逻辑...如果您想对名称匹配感兴趣,我会选择一个与 SQL 匹配的基本列表,然后使用 PHP 代码(带有正则表达式) “模糊/最佳”匹配或逻辑。

关于php - MySql 匹配最具体的人名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22086682/

相关文章:

php - 识别一个php文件的调用过程

php - 路由器控制 CSS 和图像

php - 使用 AVG() 进行 MySQL 查询时出现问题

php - MySQL Insert 是否允许不指定所有字段?

php - 需要 future 7 天内包含日期的所有 MySQL 行,但日期列的格式不正常

mysql多列查找

php - 特定大写编辑

mysql - 根据两个表进行记录相减

mysql - 奇怪的编码类型转换为utf8

php - PHP 中的参数化查询