我有一系列查询来查找给定用户名的问题。查询找到与用户表中的用户名相关联的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...
});
答案 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注入部分... \"" +用户名+" \"