2016-05-14 88 views
1

我有一系列查询来查找给定用户名的问题。查询查找与用户表中的用户名关联的用户ID,然后将userID附加到userID中的questionID,然后将问题附加到问题表中的questionID上。mySQL查询的冷凝系列

因为我的数据库结构遵循第二范式,并将不同的实体存储在不同的表(用户,问题等)中,所以需要跨多个表进行多个查询。

是否有可能将一系列查询压缩成1)需要较少代码和2)需要较少查询的内容?

username = escape(req.query.username); 

client.query("SELECT userID FROM user WHERE username = \"" + username + "\"", function(err, result) { 
    if (err !== null) { 
     console.log(err); 
    } 
    else { 
     client.query("SELECT questionID FROM user_question WHERE userID = " + result[0]["userID"], function(err, result) { 
      if (err !== null) { 
       console.log(err); 
      } 
      else { 
       client.query("SELECT question FROM question WHERE questionID = " + result[0]["questionID"], function(err, result) { 
        if (err !== null) { 
         console.log(err); 
        } 
        else { 
         //handle question 
        } 
       }); 
     }); 
}); 

编辑:K.巴斯蒂安下面给出了一个正确的答案。在使用现在的代码是:

var query = 
    `SELECT 
     q.question 
    FROM 
     question q 
     JOIN user_question uq ON q.questionID = uq.questionID 
     JOIN user u ON u.userID = uq.userID 
    WHERE 
     u.username = \"` + username + `\"`; 

client.query(query, function(err, result) { 
    //Handle 
}); 

编辑:后K.巴斯蒂安还指出节点MySQL库的逃跑用户输入的字符串(而不是JS执行的功能)的能力,我也实施了,进一步简化代码。

var query = 
    `SELECT 
     q.answer 
    FROM 
     question q 
     JOIN user_question uq ON q.questionID = uq.questionID 
     JOIN user u ON u.userID = uq.userID 
    WHERE 
     u.username = ` + client.escape(req.query.username); 

client.query(query, function(err, result) { 
    //Handle result... 
}); 

回答

1

你可以把你的查询到一个...

这样的事情?

select 
    q.question 
from 
    question q 
    JOIN user_question uq ON q.questionID = uq.questionID 
    JOIN user u ON u.userID = uq.userID 
WHERE 
    u.username = \"" + username + "\" 

顺便说一句......这看起来像一个潜在的SQL注入部分...... \“” +用户名+“\”

+0

变量名是在文件的顶部创建和使用JS函数'escape()'去除任何注入字符 - 你能解释为什么你仍然认为这可能是一个风险? –

+0

即时通讯不知道这是如何处理您的图书馆在JavaScript中...你用什么来从JavaScript与MySQL沟通?节点的MySQL? –

+0

是的,node-mysql。 –