如何在查询中正确使用CONCAT

时间:2016-11-03 14:31:36

标签: php mysql concat

如果我知道所有三个字段,此查询将完美运行。例如: Name1 Name2 Name3 ,甚至是前两个或最后两个名字。

SELECT 
  id, forename, middlename, surname 
FROM peoples 
WHERE 
  forename LIKE '%$search_keyword%' OR 
  middlename LIKE '%$search_keyword%' OR 
  surname LIKE '%$search_keyword%' OR 
CONCAT(forename, ' ',middlename, ' ',surname) LIKE '%$search_keyword%' ORDER BY forename DESC LIMIT 50";

然而,如果我正在搜索相同的结果,但却不知道所有名字,它就无法正常工作。

例如: Name1 Name3 ,给我0个结果。

示例:如果我输入 John Lewis ,但这个的全名是 John Shop Lewis ,则必须找到此结果。

此外,person可能没有中间名,因此默认情况下它设置为null。

2 个答案:

答案 0 :(得分:3)

由于名称的排列很多,因此更容易将其拆分并搜索每个特定部分,如下所示:

$names = explode(' ',$search_keyword);
$concat_arr = array();
foreach($names as $name) {
    $concat_arr = "CONCAT(forename, ' ',middlename, ' ',surname) LIKE '%$name%'";
}
$query = "SELECT 
  id, forename, middlename, surname 
FROM peoples 
WHERE ";
$query .= implode(' AND ',$concat_arr);
$query .= " ORDER BY forename DESC LIMIT 50";

答案 1 :(得分:1)

为什么不添加OR CONCAT(forename, ' ',surname) LIKE '%search_keyword%'

(也就是说,如果您绝对想在SQL中使用,而不是使用PHP explode,正如@aynber在评论中所建议的那样。

| id | forename | middlename | surname |
|----+----------+------------+---------|
| 1  | John     | Shop       | Smith   |
| 2  | John     | NULL       | Smith   |

以下查询

SELECT id, forename, middlename, surname 
FROM peoples
WHERE 
    forename LIKE '%John Smith%'
    OR middlename LIKE '%John Smith%'
    OR surname LIKE '%John Smith%' 
    OR CONCAT(forename, ' ',middlename, ' ',surname) LIKE '%John Smith%'
    OR CONCAT(forename, ' ',surname) LIKE '%John Smith%'
ORDER BY forename LIMIT 50

将返回第1行和第2行。