我想在我的桌子上搜索一列名字和一列姓氏。我目前接受来自字段的搜索字词,并将其与两列进行比较,一次一个地与
进行比较 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函数比在中间运行更好吗?
答案 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;