冷凝系列的mySQL查询

时间:2016-05-14 10:47:15

标签: javascript mysql database

我有一系列查询来查找给定用户名的问题。查询找到与用户表中的用户名相关联的userID,然后是user_question表中附加到userID的questionID,然后是问题表中附加到questionID的问题。

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

是否有可能将一系列查询压缩成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. Bastian指出node-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 个答案:

答案 0 :(得分: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注入部分... \"" +用户名+" \"