2017-04-27 86 views
0

My previous question對於我的問題沒有給出清晰的概念,這就是爲什麼我要問一個新問題。基於用戶輸入的Mysql過濾器查詢

這裏是我的表結構

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

回答

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

}