一种涵盖所有串联组合的简单方法

时间:2015-11-19 10:12:03

标签: php mysql mysqli

我正在使用LIKE "Asia/Tokyo"查询为我的项目创建搜索功能。

在我尝试将功能设置为“用户友好”时,我发现自己包含了大量的CONCAT请求。

mysqli

这里的想法是允许用户以任何顺序输入他们的搜索,以找到他们正在寻找的确切内容。

例如,用户“A”可能不记得街道的名称,因此他们搜索街道号码和郊区。或者他们可能会记住联系人的名字和郊区,但不记得姓氏。

所以我的问题是,是否有一个简单的条目可以涵盖单个WHERE选择的所有可能的连接组合?

实施例

$contact = $mysqli->query("SELECT * FROM contact WHERE k_name LIKE '%$searching%' OR f_name LIKE '%$searching%' OR l_name LIKE '%$searching%' OR concat( f_name,l_name ) LIKE '%$searching%' OR concat( k_name, l_name ) LIKE '%$searching%' OR mobile LIKE '%$searching%' OR phone LIKE '%$searching%' OR w_phone LIKE '%$searching%' OR w_fax LIKE '%$searching%' OR k_email LIKE '%$searching%' OR email LIKE '%$searching%' OR w_email LIKE '%$searching%' order by id LIMIT 5");

2 个答案:

答案 0 :(得分:0)

使用Concat_ws: -

WHERE concat_ws(' ',k_name,f_name,l_name,phone...) LIKE '%$searching%'

答案 1 :(得分:0)

为了达到我追逐的结果,我遵循了@RavinderReddy的建议。

我开始爆炸字符串

$search_text = $_GET['userInput'];  
$searching = strtolower($search_text);
$explode = explode(" ", $searching);

然后我检查了内容的各个爆炸并输出结果

if($explode[0] != ''){
    $firstterm = $explode[0];
}else{
    $firstterm = '@@@';
}
if($explode[1] != ''){
    $secondterm = $explode[1];
}else{
    $secondterm = '@@@';
}
if($explode[2] != ''){
    $thirdterm = $explode[2];
}else{
    $thirdterm = '@@@';
}
}

我使用'@@@',因为它永远不会匹配我的任何数据。

最后,我修改了我的mysqli查询以反映并包含新的OR LIKE搜索词。

$contact = $mysqli->query("
SELECT * FROM contact WHERE 
f_name LIKE '%$firstterm%'
OR l_name LIKE '%$firstterm%'
OR concat( f_name,l_name ) LIKE '%$firstterm%'

OR f_name LIKE '%$secondterm%'
OR l_name LIKE '%$secondterm%'
OR concat( f_name,l_name ) LIKE '%$secondterm%'

order by id LIMIT 5");

要考虑的是我已经设置了我的数据库,以便所有条目都不包含任何空格。在显示我的数据时,为了保持一致,我已经这样做了,并且让用户能够以他们想要的方式“格式化”他们的搜索,并且仍然可以找到他们想要的结果。

我要采取的下一步是尝试找到一种方法,通过与“id”匹配的大量匹配字符来“订购”。原因是,如果我输入'C Blogs'寻找'Craig Blogs'''C'会因为电子邮件地址'。''而对我的所有联系人产生影响。

因此,如果我能通过大多数匹配字符将其输入ORDER,那么理论上最重要的结果应该是“Craig Blogs”。

注意:我是这个网站的新手,也是我回答问题的新手。如果格式不佳或我过度解释,我很抱歉。