我想在我的桌子上搜索一列名字和一列姓氏.我目前接受来自字段的搜索字词,并将其与两列进行比较,一次一个
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函数比在中间运行更好吗?
你有什么应该工作,但可以减少到:
select * from table where concat_ws(' ',first_name,last_name) like '%$search_term%';
你能提供一个示例名称和搜索术语吗?
请注意,搜索查询现在区分大小写.
使用时
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的回答.