[英]NodeJS Mysql Query with multiple fields in where clause
我正在使用 MySQL 一段时间,还在 NodeJS 中构建了一个 API,包括用于工作的 mySQL
基本上我需要一个像“SELECT * FROM table WHERE fieldA=varA AND/OR fieldB=valB”这样的查询
我正在使用“mysql.format(sql, args)”来格式化我的查询,所以我正在使用? 和?? 在我的查询中。
我想编写一个基本查询,我可以使用并提供所有需要的字段和值
我尝试了以下方法
-> "SELECT * FROM table WHERE?" 用“{fieldA: varA, fieldB: varB}”代替?
导致“SELECT * FROM table WHERE fieldA
='varA', fieldB
='varB'”
-> "SELECT * FROM table WHERE??=?" 用“['fieldA','fieldB']”和“['varA','varB']”作为替换
是什么导致“SELECT * FROM table WHERE fieldA
, fieldB
='varA','varB'”
现在我“只”需要 2 个不同的字段,所以我可以添加固定的“fieldA=?和/或 fieldB=?” 并仅填写值。 但我想要一种动态的方式,并提供我可能需要的所有字段,如果我使用 AND 或 OR 进行组合。
我在文档中没有找到这样的东西,也许这里有人以前偶然发现过。 或者它可能是动态添加一些“AND/OR??=?”的唯一解决方案查询并用fieldName,值一个接一个地填充arguments数组?
考虑这些是构建动态查询字符串所需的字段。
var fields = [{fieldName:"A",value:"one",operator:"AND"},{fieldName:"B",value:"two",operator:""}];
现在尝试使用该数组构建查询字符串。 目前我只考虑了两个字段,但您可以根据需要添加。
var fields = [{fieldName:"A",value:"one",operator:"AND"},{fieldName:"B",value:"two",operator:""}];
var query = "SELECT * FROM table WHERE ";
fields.forEach((f)=>{
query=query+`${f.fieldName} = ${f.value} `
if(f.operator!="") query=query+f.operator+" "
})
console.log(query)
我现在已经为此建立了一个方法,并附有来自 Ameers 回答的提示。 它将生成一个查询,如
SELECT * FROM ?? WHERE ??=? AND/OR ??=? AND/OR ??=?
然后将 fieldName 和值添加到 mysql.format 的参数数组中
var fieldValues = [
{ field: 'command', value: command.command, operator: 'OR' },
{ field: 'alias', value: command.command, operator: 'OR' }
];
exists(fieldValues) {
let query = 'SELECT * FROM ??';
let args = ['tablename'];
for (let i = 0; i < fieldValues.length; i++) {
let operator = i == 0 ? 'WHERE' : fieldValues[i].operator;
query += ` ${operator} ?? = ?`;
args.push(fieldValues[i].field);
args.push(fieldValues[i].value);
}
return mysql.query(query, args);
}
mysql.query()
这里是我围绕mysql.connection.query
和使用承诺的包装器
也许有更好的内置方法,但我还没有找到,这样我仍然可以使用内置的 mysql-formatter 函数。
考虑一下,您在数据库中有first_name
、 last_name
、 personal_email,
work_email
和office_name
等字段。 并且您想获得与搜索字段匹配的所有结果。 即let search = req.query.search.
像 Objection.js 这样的 ORM 会变得很容易所以使用 objection.js 的查询会像这样
if (search) {
table_name.where('column_name.last_name', 'like', `%${search}%`)
.orWhere('column_name.first_name', 'like', `%${search}%`)
.orWhere('column_name.personal_email', 'like', `%${search}%`)
.orWhere('column_name.work_email', 'like', `%${search}%`)
.orWhere('column_name.office_name', 'like', `%${search}%`)
}
注意:此代码在 nodejs 中,您也可以使用table_name
也可以添加model_name
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.