在mySQL

时间:2016-05-05 23:08:26

标签: php mysql

我正在创建一个搜索引擎,我需要进行一个查询,查找来自用户表的四个列中的匹配数据:name,second_name,lastname和second_lastname,所以如果我查询这样的内容:

"SELECT * FROM table_users WHERE name LIKE '%".$searchTerm."' OR last_name LIKE '%".$searchTerm."' OR second_name LIKE '%".$searchTerm."' OR second_last_name LIKE '%".$searchTerm."'

以一个包含此行数据的行的表为例:

name: Joe;
lastname:Doe;
second_name:Jordan;
second_lastname: Doeman; 

搜索Joe,或Doe,或Jordan或Doeman会从这个Joe行获得结果,但是一起搜索Joe Doe并没有给我任何结果,因为Joe Doe在任何列中都不像我遇到了Doe的第一个D,所以我的问题是,有没有办法让这个行受到影响,比如%term%,但不是从这里到这里,而是'在'内。在某种程度上这样一个术语就像Joe Doe这样的术语仍然给我Joe Row的结果,因为乔在Joe Doe。 (乔过量服用XDD)

我正在使用php和MySQL fyi。

问候。

2 个答案:

答案 0 :(得分:1)

您需要拆分搜索字符串,并为每个单词使用单独的LIKE。因此,如果搜索字符串为Joe Doe,则应为

WHERE name LIKE '%Joe%' OR name LIKE '%Doe%' OR lastname LIKE '%Joe%' OR lastname LIKE '%Doe%' ...

您可以像这样动态生成:

$words = explode(' ', $searchTerm);
$tests = array();
foreach($words as $w) {
    $tests[] = "name LIKE '%$w%' OR lastname LIKE '%$w%' OR second_name LIKE '%$w%' OR second_lastname LIKE '%$w%'";
}
$test_string = implode(' OR ', $tests);
$sql = "SELECT * FROM table_users WHERE $test_string";

答案 1 :(得分:0)

您要找的是CONCAT_WS()

所以而不是:

"SELECT * FROM table_users WHERE name LIKE '%".$searchTerm."' OR last_name LIKE '%".$searchTerm."' OR second_name LIKE '%".$searchTerm."' OR second_last_name LIKE '%".$searchTerm."'

尝试:

"SELECT * FROM table_users WHERE concat_ws(' ',first_name,last_name) 
'%".$searchTerm."%';"