MySql Запрос формы для фильтров или предложение Ignore WHERE для значения столбца в NodeJS - PullRequest
1 голос
/ 06 августа 2020

Я пытаюсь получить список пользователей, в котором пол, регион и статус являются обязательными фильтрами в моем приложении. Фильтрация работает нормально, когда пол равен 0 или 1. Проблема в том, что мне нужны оба. Сценарий одинаков для всех 3 фильтров.

API: https://website.com/api/getUsers?gender=0&region=1&status=1 для получения результатов фильтра.

ПОДХОД 1: Я хочу передать что-то для этих параметров api, например . гендер = # $%, так что он игнорирует его предложение WHERE при передаче его в queryInputs ниже.

module.exports.getMatches = ({offset, gender, status, region}, callback) => {
var dbQuery = 'SELECT * from `users` WHERE `gender` = ? AND `status` = ? AND `region` = ? LIMIT ? OFFSET ?';
var queryInputs = [parseInt(gender), parseInt(status), parseInt(region), 10, parseInt(offset)];

db.query(dbQuery, queryInputs, function(err, result) {
    //code goes here
});
}

ПОДХОД 2: Я передаю пустые параметры для проверки, чтобы получить все данные для конкретных фильтров, например. https://website.com/api/getUsers?gender=&region=1&status=

Я пытаюсь избежать предложения WHERE, если я передаю пустые параметры в api. Это почти сработало для меня, если бы в запросе не было последнего И перед LIMIT.

module.exports.getMatches = ({offset, gender, status, region}, callback) => {
var dbQuery = 'SELECT * from `users`';
if( gender != '' || status!= '' || region != '') dbQuery += ' WHERE'
if(gender != ''){
    dbQuery += ' `gender` = '+ db.escape(parseInt(gender))+' AND';
}
if(status != ''){
    dbQuery += ' `status` = '+ db.escape(parseInt(status))+' AND';
}
if(region != ''){
    dbQuery += ' `region` = '+ db.escape(parseInt(region))+' AND';
}
dbQuery += ' LIMIT 10 OFFSET ' + db.escape(parseInt(offset));

db.query(dbQuery, queryInputs, function(err, result) {
    //code goes here
});
}

Среди этих двух подходов решение для всех работает для меня.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Вот редактирование вашего второго подхода. Это должно позволить вам поставить «И» перед добавлением запроса, чтобы избежать указанной ошибки.

module.exports.getMatches = ({offset, gender, status, region}, callback) => {
var dbQuery = 'SELECT * from `users` WHERE 1=1 ';
//if( gender != '' || status!= '' || region != '') dbQuery += ' WHERE'
if(gender != ''){
    dbQuery += 'AND `gender` = '+ db.escape(parseInt(gender));
}
if(status != ''){
    dbQuery += 'AND `status` = '+ db.escape(parseInt(status));
}
if(region != ''){
    dbQuery += 'AND `region` = '+ db.escape(parseInt(region));
}
dbQuery += ' LIMIT 10 OFFSET ' + db.escape(parseInt(offset));

db.query(dbQuery, queryInputs, function(err, result) {
    //code goes here
});
}
0 голосов
/ 06 августа 2020

в соответствии с лучшими практиками, если вы хотите получить всех пользователей, вы можете следовать подходу, приведенному ниже:

1: Создайте новый API (/ allUsers) с разбивкой на страницы, очевидно, и создайте отдельный SQL оператор для этого API, где вам не нужно добавлять предложение фильтра.

OR

2: добавить проверку валидации в существующий API, если нет параметра, не применить фильтры, в противном случае применить как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...