sql喜欢从三列查询fullname

时间:2012-03-26 16:11:24

标签: php mysql sql sql-like

我有一个以全名为例的文本字段:michael peter johnson 在我的表中,我有三列firstName,middlename和lastname 我写了这个查询,但它返回空

SELECT firstName,middleName,lastName
FROM staff
WHERE firstName LIKE "%michael peter johnson%"
OR middleName LIKE "%michael peter johnson%"
OR lastName LIKE "%michael peter johnson%" 

如果用户输入儿子,它应该显示michael peter johnson,因为儿子包含在约翰逊中。

感谢 我的表:firstName有(michael)middleName有(彼得)lastName(约翰逊)

6 个答案:

答案 0 :(得分:8)

如果我理解的话,它目前适用于firstname / middlename / lastname的部分,但如果你想输入全名则不行。

要解决这个问题,yOu可以使用concat,因此它始终有效:

select firstName,middleName,lastName 
from staff 
where concat(firstName, ' ', middlename, ' ', lastname) Like "%michael peter johnson%"

答案 1 :(得分:4)

您正在检查其中包含{{1>} 所有 的字符串。

您需要三个单独的陈述,并进行不同的比较......

michael peter johnson

可以反转逻辑......

WHERE
   firstName  Like '%michael%'
or middleName Like '%peter%'
or lastName   Like '%johnson%"


您还举例说明搜索WHERE 'michael peter johnson' LIKE '%' + firstName +'%' or 'michael peter johnson' LIKE '%' + middleName +'%' or 'michael peter johnson' LIKE '%' + lastName +'%' 。您现有的代码为此工作。当您将名称的每个部分与具有所有名称的参数进行比较时,这只是一个“问题”。

那么,也许你想要两个版本在一起?

'son'

您只需确定您想要的行为,然后再进行处理。

答案 2 :(得分:1)

你想要这些内容:

SELECT * FROM mytable
 WHERE CONCAT(firstName, ' ', middleName, ' ', lastName) LIKE '%son%'

这会将所有名称字段连接成一个全名。

希望这会有所帮助。您可能希望在等式的两边都做LOWER()。如果我可以添加评论,如果你的数据库中有很多名字,这不是一个特别好的方法。

答案 3 :(得分:1)

在sql中:

firstName Like "%michael peter johnson%"

表示名字可以以任何字符开头,然后字符串“michael peter johnson”应该在其中,最后一个%表示它可以以任何字符结尾。 如果你想找到带儿子的约翰逊作为输入,你的测试应该是

select firstName,middleName,lastName 
from staff 
where firstName Like "%son%" 
  or middleName Like "%son%" 
  or lastName Like "%son%"

或者使用正则表达式:

select firstName,middleName,lastName 
from staff 
where firstName REGEXP ".*son.*" 
  or middleName REGEXP ".*son.*" 
  or lastName REGEXP ".*son.*"

答案 4 :(得分:0)

实际上,您的查询应如下所示:

where CONCAT("%",firstName,"%") Like "michael peter johnson" 
or CONCAT("%",middleName,"%") Like "michael peter johnson" 
or CONCAT("%",lastName,"%") Like "michael peter johnson" 

原因是LIKE将%与任意数量的字符匹配,但不会删除字符 - 例如,"test"匹配"%es%"但不匹配"%atesta%"。希望这会有所帮助。

答案 5 :(得分:0)

您可以在查询中使用concat函数:

select firstName,middleName,lastName from staff where CONCAT(firstName,middleName,lastName) like ('%johnson%');