【问题标题】:sql like query fullname from three columnssql like 从三列查询全名
【发布时间】:2012-04-10 04:02:19
【问题描述】:

我有一个包含全名示例的文本字段: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%" 

如果用户键入son,它应该显示michael peter johnson,因为son 包含在johnson 中。

谢谢 我的表:firstName 有 (michael) middleName 有 (peter) lastName (johnson)

【问题讨论】:

  • 你能详细说明一下吗?它不是很清楚实际存储在数据库中的内容。
  • nvm,我看到你有三个属性。您需要一次对一个属性值使用“LIKE”,而不是一次全部使用(参见 Dems 答案)

标签: php mysql sql sql-like


【解决方案1】:

如果我理解得很好,它目前适用于部分名字/中间名/姓氏,但如果您想输入全名,则不适用。

要解决这个问题,你可以使用 concat,所以它总是有效的:

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

【讨论】:

  • 这结合了条目,虽然字段名称暗示这是他想要的,但这不是他想要的 - 他希望 任何 匹配,而不是 所有,正如您的回答所提供的那样。
  • 这就是我在问题开始时问他的原因;)我认为这可能比爆炸值来测试每个字段更容易实现:作为任何开发人员,我很懒而且我没有提供任何超出指定的内容:P /* 只是在开玩笑 */
  • @Tim,haltabush 回复后用户更改了问题。
【解决方案2】:

您正在检查包含 all of 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' 的示例。您现有的代码为此工作。当您将名称的每个单独部分与包含所有名称的参数进行比较时,这只是一个“问题”。

那么,也许您想要两个版本一起使用?

WHERE
   'michael peter johnson' LIKE '%' + firstName  +'%'
or 'michael peter johnson' LIKE '%' + middleName +'%'
or 'michael peter johnson' LIKE '%' + lastName   +'%'
or firstName  LIKE '%' + 'michael peter johnson' + '%'
or middelName LIKE '%' + 'michael peter johnson' + '%'
or lastName   LIKE '%' + 'michael peter johnson' + '%'

您只需要确切地确定您想要什么行为,然后完成它。

【讨论】:

  • 这仍然与他的部分条目不匹配,如他的示例中的“儿子”。
【解决方案3】:

你想要一些类似的东西:

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

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

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

【讨论】:

  • 如果排序规则名称以 _ci (ex utf8_general_ci, latin1_swedish_ci) 结尾,则不需要下限
  • 如果用户输入 michael peter johnson,这将不起作用
  • @SoroushAtarod,你为什么这么说?
【解决方案4】:

在sql中:

firstName Like "%michael peter johnson%"

表示名字可以以任何字符开头,然后字符串“michael peter johnson”应该在其中,最后一个 % 表示它可以以任何字符结尾。 如果您想找到以儿子为输入的 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.*"

【讨论】:

  • 这很正常,你要求儿子作为输入。如果您的输入可以是姓名或全名的任何部分,您应该像 David Faber 一样在 where 子句中连接名字、中间名和姓氏列。你用“%[the input]%”替换你的“%son%”(不包括大括号[)。您还应该确保每个单词之间只有一个空格。
【解决方案5】:

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

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%"。希望这会有所帮助。

【讨论】:

  • 我认为您的操作数位于 LIKE 运算符的错误一侧
【解决方案6】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2017-08-15
    • 2012-05-20
    相关资源
    最近更新 更多