在concat_ws中有两个部分MySQL匹配?

时间:2014-12-29 14:46:16

标签: php mysql

这是我的用例:我按名字和姓氏搜索一个人,但只输入部分名字和部分姓氏,如何创建一个可以捕获所有可能的WHERE子句方案

例如,我输入" Joe Smith"它有一个结果。我输入#34; Joe"它有乔史密斯和其他几个乔。我打字#34; Joe Sm"它给了我乔史密斯。

我希望能够输入" J Smit"得到乔史密斯,这可能吗?在做LIKE之前,我是否需要在PHP中的空格上打破搜索词?

这是我到目前为止所使用的完整匹配:

WHERE CONCAT_WS(' ', owner.first_name, owner.last_name)  
LIKE '%". $searchTerm ."%'

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

为什么不在PHP中输入explode(' ',$input),然后在WHERE子句中比较该数组的所有值?

$inputArray = explode(' ',$input);
foreach ($inputArray as $part)
{
  $whereArray = "CONCAT_WS(' ',owner.first_name,owner.last_name) LIKE '%$part%'";
}
$where = implode(' AND ',$whereArray);

然后像这样使用它:

$query = "SELECT * FROM owner WHERE $where";

请注意安全,我没有那样做。

这仍然不能做你想要的。因为当您想要搜索“J Smit”时,您希望系统足够智能,搜索一个部分,在名字列中说“J”,在姓氏列中说“Smit”。显然,这更复杂,并且复杂性随着要匹配的部件数量而增加。有一个解决方案,但你不会喜欢它,它是丑陋的。

有没有人得到一个,而不是那么丑陋的解决方案?

答案 1 :(得分:0)

听起来您确实希望将搜索字词拆分为名字和姓氏组件,然后分别对LIKEowner.first_name进行owner.last_name次比较。不幸的是,我不知道本机mySQL对直接字符串拆分的支持。

首先在PHP中拆分肯定是一种选择(@KIKOSoftware的答案似乎做得很好)。如果你想尝试在mySQL中完成所有这一切,那么这个问题提供了一些见解(你将不得不修改你的用例,因为你在空格而不是用逗号分隔):

How to split the name string in mysql?