Mysql根据用户输入过滤查询

时间:2017-04-27 06:13:17

标签: mysql node.js rest express

My previous question没有明确提出我的问题,这就是我提出新问题的原因。

这是我的表结构

id,
subject (varchar),
category(varchar),
medium(json),
material(json),
style(json)

用户可以根据表字段中的值进行搜索,即用户是否仅选择subject(他可以从多个选择下拉列表中选择)查询结果中包含与所选项匹配的行。

如果用户选择的主题和类别查询结果包含与所选项目匹配的行等等(简而言之,它是一个过滤搜索,如购物网站)

问题是我不知道如何基于这些输入有效地构建MySQL查询,因为一些Mysql列是JSON。

以下是单独的SQL查询:

// select rows that contains subject test or test1
SELECT * 
FROM `cushbu_art` 
WHERE subject IN ('test','test1')

// select rows that contains medium is paper or food
SELECT * 
FROM `cushbu_art` 
WHERE (JSON_CONTAINS(medium, '["paper"]') 
       OR JSON_CONTAINS(medium, '["food"]'))

以下是包含两个参数(subjectmedium

的示例输入
{
    "subject":["test","test1"],
    "medium":["paper","wood"],
    "category":"",
    "material":"",
    "style":""
}

注意:输入和输出是JSON(REST API)

db.js

function(req, res) {
    var sql = '';

    if(req.body.subject) {
        sql+=//PREPARE SUBJECT QUERY
    }

    if(req.body.medium) {
       sql+=//PREPARE QUERY
    }

    //FINAL SQL QUERY HERE;
    db.query(sql, function(error, result) {
       console.log(result);
    });
}

1 个答案:

答案 0 :(得分:0)

function(req,res){
 var sql = 'SELECT * FROM `cushbu_art`';

 //Check if only on is set
 if(req.body.subject && !req.body.medium){
  var subjectJoin=req.body.subject.join(',');
  sql+='WHERE subject IN ('+subjectJoin+')';

}

 //Check if only on is set 
if(req.body.medium && !req.body.subject){
      sql+='WHERE (JSON_CONTAINS(medium,'+req.body.medium[0]+') OR JSON_CONTAINS(medium,'+req.body.medium[1]+')';
}

if(req.body.medium && req.body.subject){

 var subjectJoin=req.body.subject.join(',');

 sql+='WHERE subject IN ('+subjectJoin+') AND (JSON_CONTAINS(medium,'+req.body.medium[0]+') OR JSON_CONTAINS(medium,'+req.body.medium[1]+')';

}

  //FINAL SQL QUERY HERE';
  db.query(sql,function(error,result){
   console.log(result);
 });

}