如果我知道所有三个字段,此查询将完美运行。例如: 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。
答案 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行。