这是我的用例:我按名字和姓氏搜索一个人,但只输入部分名字和部分姓氏,如何创建一个可以捕获所有可能的WHERE子句方案
例如,我输入" Joe Smith"它有一个结果。我输入#34; Joe"它有乔史密斯和其他几个乔。我打字#34; Joe Sm"它给了我乔史密斯。
我希望能够输入" J Smit"得到乔史密斯,这可能吗?在做LIKE之前,我是否需要在PHP中的空格上打破搜索词?
这是我到目前为止所使用的完整匹配:
WHERE CONCAT_WS(' ', owner.first_name, owner.last_name)
LIKE '%". $searchTerm ."%'
非常感谢任何帮助。
答案 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)
听起来您确实希望将搜索字词拆分为名字和姓氏组件,然后分别对LIKE
和owner.first_name
进行owner.last_name
次比较。不幸的是,我不知道本机mySQL对直接字符串拆分的支持。
首先在PHP中拆分肯定是一种选择(@KIKOSoftware的答案似乎做得很好)。如果你想尝试在mySQL中完成所有这一切,那么这个问题提供了一些见解(你将不得不修改你的用例,因为你在空格而不是用逗号分隔):