基于用户输入的Mysql过滤查询

基于用户输入的Mysql过滤查询,mysql,node.js,rest,express,Mysql,Node.js,Rest,Express,我没有对我的问题给出一个清晰的想法,这就是为什么我要问一个新问题 这是我的桌子结构 id, subject (varchar), category(varchar), medium(json), material(json), style(json) 用户可以基于表字段中的值进行搜索,即如果用户仅选择主题(他可以从多个选择下拉列表中选择),则查询结果包含与所选项目匹配的行 如果用户选择的主题和类别查询结果包含与所选项目匹配的行,等等(简而言之,这是一个类似于购物网站的筛选搜索) 问题是我不知道

我没有对我的问题给出一个清晰的想法,这就是为什么我要问一个新问题

这是我的桌子结构

id,
subject (varchar),
category(varchar),
medium(json),
material(json),
style(json)
用户可以基于表字段中的值进行搜索,即如果用户仅选择
主题
(他可以从多个选择下拉列表中选择),则查询结果包含与所选项目匹配的行

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

问题是我不知道如何基于这些输入高效地构建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"]'))
这是一个带有两个参数的示例输入(
subject
medium

注意:输入和输出是JSON(RESTAPI)格式的

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);
    });
}
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);
    });
}
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);
 });

}