在WHERE子句中使用mysql concat()?

时间:2008-11-19 22:44:12

标签: php mysql

我想在我的桌子上搜索一列名字和一列姓氏。我目前接受来自字段的搜索字词,并将其与两列进行比较,一次一个地与

进行比较
    select * from table where first_name like '%$search_term%' or 
    last_name like '%$search_term%';

这适用于单字搜索术语,但结果集包含名称为“Larry”的所有人。但是如果有人输入名字然后是空格,那么是姓氏,我想要一个更窄的搜索结果。我试过以下没有成功。

    select * from table where first_name like '%$search_term%' or last_name 
    like '%$search_term%' or concat_ws(' ',first_name,last_name) 
    like '%$search_term%';

有什么建议吗?

编辑:我正在测试的名字是“拉里史密斯”。 db将“Larry”存储在“first_name”列中,将“Smith”存储在“last_name”列中。数据干净,没有多余空格,搜索项左右修剪。

编辑2:我今天早上尝试了Robert Gamble的答案。他和我昨晚的比赛非常相似。我无法解释,但今天早上它有效。我能想到的唯一区别是,昨晚我将concat函数作为搜索查询的第三个“或”段运行(在查看first_name和last_name之后)。今天早上,我查看了上面的内容以及地址和商家名称,将其作为最后一段。

在查询结束时运行mysql函数比在中间运行更好吗?

7 个答案:

答案 0 :(得分:79)

你有什么应该工作,但可以简化为:

select * from table where concat_ws(' ',first_name,last_name) 
like '%$search_term%';

您是否可以提供不起作用的示例名称和搜索字词?

答案 1 :(得分:11)

请注意,搜索查询现在区分大小写。

使用时

SELECT * FROM table WHERE `first_name` LIKE '%$search_term%'

它将匹配“拉里”和“拉里”。有了这个concat_ws,它会突然变得区分大小写!

可以使用以下查询修复此问题:

SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', `first_name`, `last_name`) LIKE UPPER('%$search_term%')

编辑:请注意,这仅适用于非二进制元素。另请参阅mynameispaulie's answer

答案 2 :(得分:4)

对吕克来说:

我同意你的回答,虽然我想补充说UPPER仅适用于非二进制元素。如果您正在使用AGE列(或任何数字),则需要执行CAST转换以使UPPER功能正常工作。

SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', first_name, last_name, CAST(age AS CHAR)) LIKE UPPER('%$search_term%');

原谅我没有直接回答吕克的回答,但对于我的生活,我无法弄清楚如何做到这一点。如果管理员可以移动我的帖子,请执行此操作。

答案 3 :(得分:2)

SELECT *,concat_ws(' ',first_name,last_name) AS whole_name FROM users HAVING whole_name LIKE '%$search_term%'

......可能就是你想要的。

答案 4 :(得分:1)

有一些事情可能会妨碍你的数据清理吗?

可能是你在第一个名字字段的末尾有空格,这意味着当你连接它们时,firstname和lastname之间有两个空格?使用trim(first_name)/ trim(last_name)将解决此问题 - 尽管真正的修复方法是更新数据。

你也可以匹配两个单词出现但不一定在一起的地方(假设你在php中 - $ search_term变量暗示你是这样)

$whereclauses=array();
$terms = explode(' ', $search_term);
foreach ($terms as $term) {
    $term = mysql_real_escape_string($term);
    $whereclauses[] = "CONCAT(first_name, ' ', last_name) LIKE '%$term%'";
}
$sql = "select * from table where";
$sql .= implode(' and ', $whereclauses);

答案 5 :(得分:1)

你可以这样做(在mysql中工作)可能还有其他的SQL .. 试试这个:

select * from table where concat(' ',first_name,last_name) 
    like '%$search_term%';

答案 6 :(得分:-1)

你可以试试这个:

select * FROM table where (concat(first_name, ' ', last_name)) = $search_term;