基于多用户输入的Mysql选择查询

基于多用户输入的Mysql选择查询,mysql,express,Mysql,Express,当前我的表有以下字段 id,medium(json) ,material(json),subject,category 我想基于用户输入执行一个过滤器,也就是说,如果用户输入出现在特定字段上,则基于该输入执行where-sql 最小码 var sql = 'SELECT * FROM table'; //category is present in userinput if(category){ sql+='WHERE category=category';

当前我的表有以下字段

id,medium(json) ,material(json),subject,category
我想基于用户输入执行一个过滤器,也就是说,如果用户输入出现在特定字段上,则基于该输入执行where-sql

最小码

var sql = 'SELECT * FROM table';

    //category is present in userinput 
    if(category){
      sql+='WHERE category=category';   
    }
    //subject is present in userinput
    if(subject){
      sql+='WHERE subject=subject'
    }
    if(material){
       sql+='WHERE material=material'
     }
   if(medium){
      sql+='WHERE medium=medium'
    }

    db.query(sql,function(error,result){
         console.log(result);
    });
但是,当存在任意两个用户输入或用户输入包含所有字段时,我不知道在sql查询中应该将和放在哪里

    var sql = 'SELECT * FROM table';
    var where = ' WHERE';

    //category is present in userinput 
    if(category){
      sql += where + ' category=category';   
      where = ' and';
    }

    //subject is present in userinput
    if(subject){
      sql += where + ' subject=subject';
      where = ' and';
    }

    if(material){
       sql += where + ' material=material';
       where = ' and';
     }

    if(medium){
      sql += where + ' medium=medium';
    }

    db.query(sql,function(error,result){
         console.log(result);
    });
编辑3:

现在,我想我说对了:>

var sql = 'SELECT * FROM table WHERE 1';

//category is present in userinput 
if(category) {
  sql+=' AND category = category';   
}
//subject is present in userinput
if(subject) {
  sql+=' AND subject = subject'
}
if(material) {
  sql+=' AND JSON_SEARCH(material, "one", material) IS NOT NULL'
}
if(medium) {
  sql+=' AND JSON_SEARCH(medium, "one", medium) IS NOT NULL'
}
请注意正确的报价。另外,更改变量名使其与表列名不对应可能是一个好主意。顺便说一句,主题和媒体都是保留名称,最好将它们放在背景中

截图:

编辑:

对不起,我误解了你的问题。使用JSON_EXTRACT从JSON列JSON_列提取数据,假设您有一个一维JSON数据结构,如

{
  "category": "Test Category"
}
你明白了

var sql = 'SELECT * FROM table WHERE 1';

//category is present in userinput 
if(category) {
  sql+=' AND category = category';   
}
//subject is present in userinput
if(subject) {
  sql+=' AND subject = subject'
}
if(material) {
  sql+=' AND JSON_EXTRACT(material, "$.json_column") = material'
}
if(medium) {
  sql+=' AND JSON_EXTRACT(medium, "$.json_column") = medium'
}
编辑2:添加了phpMyAdmin的屏幕截图:

请尝试下面的查询逻辑,从中获取参考


最小代码:没有支持php和mysql标记的代码,这使得这个问题已经不清楚了。@Fred ii-将鼠标悬停在express标记上。这是一个基于nodeThere的javascript框架,这里要做的事情比你想象的要多。我看到material和medium列都是JSON。所以有一大堆额外的东西需要在搜索标准中使用该列让我试试你的答案我猜我的答案不会起作用,我显然跳过了json列的事情…感谢更新,但我强调json是简单的,不是对象表示,例如:代替{material:Plastic}我用的是这个[塑料,纸]好的,我将修改我的答案。
var sql = 'SELECT * FROM table';
var $aux = [];

//category is present in userinput 
if(category){
  $aux[] ='category=category';   
}
//subject is present in userinput
if(subject){
  $aux[]='subject=subject'
}
if(material){
   $aux[]='material=material'
 }
if(medium){
  $aux[]='medium=medium'
}

$wheres = implode(' and ', $aux);

if($wheres)
    $sql+= ' WHERE '.$wheres;

db.query(sql,function(error,result){
     console.log(result);
});
 if(category){
              sql[] ='category=category';   
            }

            if(subject){
              sql[] ='subject=subject'
            }
            if(material){
               sql[] ='material=material'
             }
           if(medium){
              sql[] ='medium=medium'
            }
    var sql1 = 'SELECT * FROM table';

    if (index < sql.length) {
        sql1 += ' WHERE ' + sql.join(' AND ');
    }