繁体   English   中英

node.js 中的 function 中的嵌套 SQL 查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM