Mysql 使用中间名称的用户帐户的SQL查询

Mysql 使用中间名称的用户帐户的SQL查询,mysql,sql,Mysql,Sql,我有一个名为“name”的列,其中存储了用户的全名(例如:“johnwood”或“johnmichaelwood”)。我有一个查询,根据该用户的名称检查该用户在数据库中是否存在,例如: SELECT * FROM users WHERE name LIKE var.name% 其中“var.name”是一个用户在数据库中查找另一个用户的输入。如果要查找的用户名为“John Wood”,一切正常,但如果用户有中间名“John Michael Wood”,则如果字符串“John Wood”是搜索键

我有一个名为“name”的列,其中存储了用户的全名(例如:“johnwood”或“johnmichaelwood”)。我有一个查询,根据该用户的名称检查该用户在数据库中是否存在,例如:

SELECT * FROM users WHERE name LIKE var.name%
其中“var.name”是一个用户在数据库中查找另一个用户的输入。如果要查找的用户名为“John Wood”,一切正常,但如果用户有中间名“John Michael Wood”,则如果字符串“John Wood”是搜索键,则查询将找不到该用户

当搜索键为“John Wood”时,如何修改查询以查找用户“John Michael Wood”?换句话说,如果用户有中间名,即使搜索字符串中没有包含中间名,也应该在数据库中找到他们。

您应该尝试以下查询:
从名为“%var.name%”的用户中选择*

现在,当您搜索John时,这将返回名称字符串中任何实例中有John的所有名称

您应该尝试以下查询:
从名为“%var.name%”的用户中选择*


现在,当您搜索John时,这将返回名称字符串中任何实例中包含John的所有名称

您可以使用正则表达式来解决此问题,将名字和姓氏之间的空格替换为搜索空格,后跟可选中间名(一组字母字符)和另一个空格。例如:

SELECT *
FROM users
WHERE name REGEXP CONCAT('^', REPLACE('John Wood', ' ', ' ([[:alpha:]]+ )?'), '$')

输出:

id  name
1   John Wood
4   John Michael Wood

您可以使用正则表达式来解决这个问题,将名字和姓氏之间的空格替换为搜索空格,后跟可选的中间名(一组字母字符)和另一个空格。例如:

SELECT *
FROM users
WHERE name REGEXP CONCAT('^', REPLACE('John Wood', ' ', ' ([[:alpha:]]+ )?'), '$')

输出:

id  name
1   John Wood
4   John Michael Wood

另一种选择是使用全文索引。如果您的
name
列上有全文索引,则下面的查询应同时返回
'John Wood'
'John Michael Wood'

SELECT * FROM users
WHERE MATCH(`name`) AGAINST ('John Wood' IN NATURAL LANGUAGE MODE)

另一种选择是使用全文索引。如果您的
name
列上有全文索引,则下面的查询应同时返回
'John Wood'
'John Michael Wood'

SELECT * FROM users
WHERE MATCH(`name`) AGAINST ('John Wood' IN NATURAL LANGUAGE MODE)

用空格分隔名称,然后在varius
中重新查询它们,如
。。。假设您有一个名称(按空格)分隔的数组,您需要为每个数组位置创建一个类似于的句子。并使用类似“%your-i-array-position-value%”的
,或者预先将所有空格替换为“%”。查询将变成“SELECT*FROM users”,其中名称“%John%Wood%”向我们显示一些示例表数据和预期结果。包括马尔科姆·麦克道尔、柯南·奥布莱恩、卡尔·范德沃尔特和乔纳森·里斯·戴维斯,让事情变得更加棘手!这种设计在任何关系数据库系统中都是不明智的。为什么不是名字,中间名,姓氏?根据您的示例,您无法为姓氏甚至中间名编制索引,这将导致全表扫描而不是索引查找。@WhiteRabbit您的解决方案似乎运行良好,谢谢。请将名称与空格分开,然后在varius
中重新查询它们,如
。。。假设您有一个名称(按空格)分隔的数组,您需要为每个数组位置创建一个类似于
的句子。并使用类似“%your-i-array-position-value%”的
,或者预先将所有空格替换为“%”。查询将变成“SELECT*FROM users”,其中名称“%John%Wood%”向我们显示一些示例表数据和预期结果。包括马尔科姆·麦克道尔、柯南·奥布莱恩、卡尔·范德沃尔特和乔纳森·里斯·戴维斯,让事情变得更加棘手!这种设计在任何关系数据库系统中都是不明智的。为什么不是名字,中间名,姓氏?根据您的示例,您无法为姓氏甚至中间名编制索引,从而导致全表扫描而不是索引查找。@TheWhiteRabbit您的解决方案似乎工作正常,谢谢。您的解决方案似乎工作正常(未试用),但我同意评论中提供的答案。@dmc4评论中的解决方案可能会给出不准确的结果。请看,您的解决方案似乎有效(未尝试),但我同意评论中提供的答案。@dmc4评论中的解决方案可能会给出不准确的结果。很遗憾,请参见,它返回的任何内容远程看起来像
John Wood
。布尔模式工作得更好,但不处理连字符的姓氏或当第一个搜索词是此人的中间名时。不幸的是,这会返回任何看起来像
John Wood
的内容。布尔模式工作得更好,但不处理连字符的姓氏或当第一个搜索词是此人的中间名时。