Запрос NodeJS Mysql с несколькими полями в предложении where

#mysql #node.js

#mysql #node.js

Вопрос:

Я некоторое время работаю с MySQL, а также создал API в NodeJS, включая MySQL для работы

В принципе, мне нужен запрос типа «ВЫБРАТЬ * ИЗ таблицы, ГДЕ FieldA = varA И / ИЛИ FieldB = valB»

Я использую «mysql.format (sql, args)» для форматирования моего запроса, поэтому я использую? и ?? в моих запросах.

Я хотел бы написать базовый запрос, который я мог бы использовать и вводить все необходимые поля и значения

Я пробовал следующие способы

-> «ВЫБРАТЬ * ИЗ таблицы WHERE?» с «{FieldA: varA, FieldB: varB}» в качестве замены для ?

это приводит к «ВЫБРАТЬ * ИЗ таблицы, ГДЕ fieldA = ‘varA’, fieldB =’varB'»

-> «ВЫБРАТЬ * ИЗ таблицы, ГДЕ ?? = ?» с «[‘FieldA’, ‘FieldB’]» и «[‘varA’, ‘varB’]» в качестве замен

что приводит к «ВЫБРАТЬ * ИЗ таблицы, ГДЕ fieldA , fieldB = ‘varA’, ‘varB'»

На данный момент мне «нужны только» 2 разных поля, поэтому я мог бы добавить фиксированные «FieldA =? И / ИЛИ FieldB =?» и заполнить только значения. Но я хотел бы использовать динамический способ и указать все поля, которые мне могут понадобиться в нем, а также, если я использую AND или OR при объединении.

Я не нашел ничего подобного в документации, может быть, кто-то здесь наткнулся раньше. Или это может быть единственным решением для динамического добавления некоторых «И / ИЛИ ?? = ?» к запросу и заполнению массива аргументов с помощью fieldName, значения одно за другим?

Комментарии:

1. почему бы вам сначала не создать динамическую строку запроса и не выполнить ее?

2. поскольку я использую функцию mysql.format(sql, arg) фреймворка mysql, она использует? для замены значений или?? для замены имен полей / имен таблиц. Также он автоматически экранирует все, что в нем содержится.

Ответ №1:

Рассмотрим тезисы — это поля, которые вам нужны для построения строки динамического запроса.

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)
  

Ответ №2:

Сейчас я создал метод для этого, используя подсказки из ответа Ameers. Он сгенерирует запрос типа

 SELECT * FROM ?? WHERE ??=? AND/OR ??=? AND/OR ??=?
  

а затем добавит имя поля и значения в массив аргументов для 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.

Ответ №3:

Учтите, что у вас есть поля в БД, такие как first_name , last_name , personal_email, work_email и office_name . и вы хотите получить все результаты, соответствующие полям поиска. т. Е. let search = req.query.search. Это станет легко с ORM, например Objection.js Таким образом, запрос будет выглядеть следующим образом, используя 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 .