【问题标题】:How to correctly use CONCAT in query如何在查询中正确使用 CONCAT
【发布时间】:2016-11-03 14:31:36
【问题描述】:

如果我知道所有三个字段,则此查询可以完美运行。例如: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,它一定会找到这个结果。

另外,人可能没有中间名,所以默认设置为空。

【问题讨论】:

  • 它应该返回什么?您能否向我们展示您的数据库中的摘录?另外,您的CONCAT 中有一个错字:您写的是middlenames 而不是middlename
  • @roberto06 请检查更新的问题
  • 请注意,没有 ORDER 的 LIMIT 相当毫无意义
  • 由于名称有多种排列方式,将其分解并搜索名称的每个单独部分可能会更容易。
  • @aynber 有什么建议吗?我不认为爆炸将是这个的最佳解决方案

标签: php mysql concat


【解决方案1】:

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

$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";

【讨论】:

  • 谢谢,您的代码也有效,但我和我的同事认为,@roberto06 的回答对我们来说更好。
【解决方案2】:

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

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

| 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 行。

【讨论】:

  • @aynber 的解决方案是最好的方式去恕我直言。
  • 这个解决方案最适合我已经非常困难的代码。
猜你喜欢
  • 2019-05-31
  • 2015-11-30
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 2012-11-25
  • 2011-09-01
相关资源
最近更新 更多