SQL SELECT,其中多个列包含已提交字符串的任何部分

SQL SELECT where multiple columns contain any part of submitted string

提问人:Adey 提问时间:9/27/2023 最后编辑:Adey 更新时间:9/27/2023 访问量:31

问:

扩展这个线程,这并不完全是我所追求的 - SQL SELECT WHERE 字段包含单词

我有一个“姓名”字段供某人输入全名(名字和姓氏),但MySQL数据库将数据分为2列,usrFirstName和usrLastName。

我希望选择 usrFirstName 和 usrLastName 与字符串相同的任何成员,或者如果只能输入姓氏,则选择 usrLastName 与字符串相同的所有成员。

我试过“SELECT * from users WHERE usrFirstName LIKE ?或者 usrLastName LIKE ?(其中 ? 是提交的字符串),但这不起作用,因为它在任一列中查找全名。

将不胜感激任何帮助,非常感谢。

mysql 选择

评论

0赞 Nico Haase 9/27/2023
这是MySQL问题还是AJAX问题?请分享更多细节,例如所涉及的代码
0赞 Rob Eyre 9/27/2023
也许SELECT * from users WHERE TRIM(CONCAT_WS(' ', usrFirstName, usrLastName)) = ?
0赞 Lelio Faieta 9/27/2023
绑定变量时,将通配符放在传递的字符串的开头和结尾(% 是通配符运算符)
0赞 Lelio Faieta 9/27/2023
阿贾克斯与这个问题有什么关系?
0赞 Rob Eyre 9/27/2023
如果您正在寻找相同的匹配项,请使用而不是=LIKE

答:

0赞 Rob Eyre 9/27/2023 #1

尝试

SELECT *
FROM users
WHERE TRIM(CONCAT_WS(' ', usrFirstName, usrLastName)) = ?
OR usrLastName = ?

(其中是要搜索的参数)?

CONCAT_WS用于用空格连接名字和姓氏。如果其中任何一个为 null(例如,缺少名字),则跳过它们。

TRIM用于删除数据中的任何前导空格或尾随空格(例如,如果名字或姓氏为空字符串,则可能会发生这种情况)

=用于(而不是 )来确保相同的匹配。相反,如果要搜索部分全名或部分姓氏,请更改为LIKE= ?LIKE CONCAT('%', ?, '%')

评论

0赞 Adey 9/27/2023
谢谢 Rob,如果用户输入要搜索的全名,这看起来会起作用,但是在他们可能只搜索姓氏即“Smith”的情况下,它是否仍会返回连接字符串中包含“Smith”的所有行,或者我应该使用 LIKE 而不是 = 所以它不相同?
0赞 Rob Eyre 9/27/2023
啊,我误会了——我以为你的意思是数据库中的名字可能是空白的。我调整了答案,以还包括姓氏与搜索字符串相同的行
0赞 Adey 9/27/2023
谢谢,是的,数据库中总是有名字和姓氏,但搜索的管理员用户可能会搜索全名或部分名称,并返回用户列表。