簡體   English   中英

NodeJS Mysql 在 where 子句中使用多個字段進行查詢

[英]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 fieldAfieldB ='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_namelast_namepersonal_email, work_emailoffice_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM