2016-05-14 82 views
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... 
}); 

回答

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注入部分...... \「」 +用戶名+「\」

+0

變量名是在文件的頂部創建和使用JS函數'escape()'去除任何注入字符 - 你能解釋爲什麼你仍然認爲這可能是一個風險? –

+0

即時通訊不知道這是如何處理您的圖書館在JavaScript中...你用什麼來從JavaScript與MySQL溝通?節點的MySQL? –

+0

是的,node-mysql。 –