2017-04-26 127 views
-1

目前我的表有以下字段Mysql的选择查询

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查询把AND当T的任意两个他用户输入存在或用户输入包含了所有的领域

+1

* “最小码” *:好,没有代码来支持php和mysql标签,这使得这个问题已经不清楚了。 –

+0

@ Fred-ii-将鼠标悬停在“express”标签上。它的一个JavaScript框架节点 – RiggsFolly

+0

这里有更多的事情要做,比你想象的要多。我看到'material'和'medium'列是JSON。所以有一大堆额外的东西只需要在搜索条件中使用该列 – RiggsFolly

回答

1

试试这个:

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

编辑#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' 
} 

请注意正确的引号。另外,也许这是一个好主意,以改变变量名称,所以他们不是与表列名称相对应。顺便说一句。 主题中等是保留名称,最好是反引号。

截图: New screenshot


编辑:

对不起,我误解你的问题。使用JSON_EXTRACT从JSON列json_column提取数据,假设你有一个像

{ 
    "category": "Test Category" 
} 

你的想法一维JSON数据结构。

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的新增截图: pma screenshot json_extract

+0

感谢您的更新,但我是stroing json的平原不在对象表示,例如:而不是{“材料”:“塑料”}我使用这个'[“塑料”,“纸”]' – Jabaa

+0

好吧,我会适应我的答案。 – Kapparina

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

尝试下面的逻辑为您的查询从获得参考here

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