【发布时间】:2019-05-19 20:10:18
【问题描述】:
我正在使用 Node.js 中的 MySQL 查询来搜索员工表,其中的列分为名字和姓氏
表结构:http://sqlfiddle.com/#!9/d9673e
这是我尝试过的两个查询
var FullName = req.query.FullName
const TEST2 = "SELECT StaffList.FirstName, StaffList.LastName, CONCAT(StaffList.FirstName, ' ' ,StaffList.LastName) AS FullName FROM StaffList WHERE CONCAT(StaffList.FirstName, ' ' ,StaffList.LastName) LIKE ? "
const TEST5 = "SELECT StaffList.FirstName, StaffList.LastName, CONCAT_WS(' ',StaffList.FirstName,StaffList.LastName) AS FullName FROM StaffList WHERE CONCAT_WS(' ',StaffList.FirstName,StaffList.LastName) LIKE ? "
connection.query(TEST5,FullName,(error,results) => {
if (error){
return res.send(error)
}
else{
return res.json({
data: results
})
}
})
但是如果我输入了正确的名字和姓氏,它只会从我的数据库中返回一个名字
所以我试着把它分开
const TEST6 = "SELECT StaffList.FirstName, StaffList.LastName FROM StaffList WHERE FirstName LIKE ? or LastName LIKE ? "
connection.query(TEST6,[FirstName,LastName],(error,results) => {
if (error){
return res.send(error)
}
else{
return res.json({
data: results
})
}
})
如果只有一个字段是正确的,它会返回正确的值
如何获取它以使其返回相似的值?
例如) 汤姆史密斯 史密斯罗伯逊 搜索“Smith”以返回这两个人,无论搜索值是指名字还是姓氏
【问题讨论】:
-
好吧,如果您搜索“Smith”,那么您的最后一个查询 (TEST6) 应该会返回您想要的内容。如果您还没有使用通配符,您可能需要考虑使用通配符 - 演示:sqlfiddle.com/#!9/fd0c71/2
-
这可能与TEST6有关吗?在我看来,这不会因为它在 URL 中被分解为:endpoint?FirstName=&LastName=
-
哦,我明白了,所以您有两个完全独立的输入值?我认为这可能是一个逻辑错误。只需让用户在单个字段中搜索“名称”,并让后端处理查找每个 DB 字段 - 通过在每个字段中查找相同的值,或将它们连接起来然后在连接值(更像您的 TEST2 或 TEST5 示例)。用户不需要关心你如何存储数据。如果他们只是想找一个人,他们不会对名字和姓氏的区别感兴趣。
-
例如我们有一个标准的自动完成插件,我在其中工作,我们将它放入网络应用程序中,以允许人们搜索员工 - 用户只需输入他们喜欢的任何内容,它就会消失并在数据库中查找员工的位置(任何部分)连接的名字和姓氏与字符串匹配,或者他们的(任何部分)用户名与字符串匹配。像这样很好地工作,比单独的输入字段容易得多。
-
@ADyson 感谢您的帮助 - 让它为 FullName 工作。也会研究自动完成功能:)