浓缩一系列mySQL查询

Condensing series of mySQL queries

本文关键字:查询 mySQL 一系列      更新时间:2023-09-26

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

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

是否可以将一系列查询压缩为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
});

EDIT:在K.Bastian也指出节点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...
});

您可以将查询放入一个。。。

像这样的东西?

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注入部分''"+用户名+"''"