【发布时间】:2016-05-14 10:47:15
【问题描述】:
我有一系列查询来查找给定用户名的问题。查询在 user 表中找到与用户名关联的 userID,然后在 user_question 表中找到附加到 userID 的 questionID,然后在 question 表中找到附加到 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. Bastian 给出了正确答案。现在使用的代码是:
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...
});
【问题讨论】:
标签: javascript mysql database