[英]Nested SQL queries in function in node.js
首先,我是 JS 新手。 我有一个 function 可能可以使用多个请求来获取最终数据。 我怎样才能以正确的方式做到这一点? 在此示例中,参与者不会推送到 dialogs 数组,因为它处于异步调用中。
function getDialogs(token, callback) {
//getting user id
con.query("SELECT user_id FROM users_tokens WHERE user_token = '" + token + "'", function(error, results) {
if (error) {
throw error;
}
var userId = results[0].user_id;
//getting all conversation
con.query("SELECT cc.id as conversation_id, cc.type FROM chat_conversations cc INNER JOIN chat_participants cp ON cc.id = cp.conversation_id WHERE cp.user_id = " + userId + " GROUP BY cc.id", function (error, results) {
if (error) {
throw error;
}
var dialogs = [];
for (let i = 0; i < results.length; i++) {
var dialog = {id: results[i].conversation_id};
//getting chat participants
con.query("SELECT user_id FROM chat_participants WHERE conversation_id = " + results[i].conversation_id + " AND user_id != " + userId, function (error, results) {
var participants = [];
for (let j = 0; j< results.length; j++) {
participants.push(results[j].user_id);
}
dialogs[participants] = participants;
});
dialogs.push(dialog);
}
callback(dialogs);
});
});
}
从技术上讲,您可以使用这样的单个请求
SELECT user_id FROM chat_participants WHERE conversation_id IN (
SELECT
cc.id as conversation_id,
cc.type
FROM
chat_conversations cc
INNER JOIN chat_participants cp ON cc.id = cp.conversation_id
WHERE
cp.user_id IN (
SELECT
user_id
FROM
users_tokens
WHERE
user_token = "TOKEN"
)
GROUP BY
cc.id
)
但这种方法也存在一些问题。
首先,您似乎只使用第一行的 user_id,所以在这种情况下请使用LIMIT 1
。
其次,似乎 user_id 永远不会有重复项,因此将其设为主键。
第三,不要连接你的令牌,节点 mysql 支持使用占位符?
在您的查询中,如下所示:
con.query("SELECT * FROM ? WHERE user_id = ?", ["table_name", "userid"])
第四,承诺你的请求,这样你就没有回调地狱,做这样的事情:
function promiseRequest(query, placeholders) {
return new Promise((res, rej) => {
con.query(query, placeholders, (err, data) => {
if (err) rej(err);
res(data);
});
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.