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...
});
變量名是在文件的頂部創建和使用JS函數'escape()'去除任何注入字符 - 你能解釋爲什麼你仍然認爲這可能是一個風險? –
即時通訊不知道這是如何處理您的圖書館在JavaScript中...你用什麼來從JavaScript與MySQL溝通?節點的MySQL? –
是的,node-mysql。 –