mysql - Nodejs Mysql 中的嵌套查询

标签 mysql node.js

我想计算表中包含 FOO 表的行。 以下代码有一个错误,仅显示最后一个 db_name。

RESULT IS LOOK LIKE THIS:
db_0099,0
db_0099,5
db_0099,10
db_0099,3

你能建议我如何修复nodejs代码吗?

var mysql  = require('mysql');

var sql1 = "SELECT table_schema as db_name from information_schema.tables WHERE table_name = 'FOO' ";
var sql2 = "SELECT COUNT(*) as solution FROM {0}.FOO";

var connection = mysql.createConnection({
  host     : '$$$$$$$',
  user     : '$$$$$$$',
  password : '$$$$$$$',
});

connection.connect(function(err){
  console.log('connected as id ' + connection.threadId);
});

connection.query(sql1, function(err, result) {
  if (err) throw err;

  for (var i = 0, len = result.length; i < len; i++) {
    var db_name = result[i].db_name;
    console.log(db_name);
    connection.query(sql2.replace("{0}",db_name), function(err, result) {
      if (err) throw err;
      console.log(db_name+','+result[0].solution); //Here db_name is showed only the last one.
    });
  };

  connection.end();
});

最佳答案

我建议分两步解决这个问题:

  1. 使用连接池

    var 池 = mysql.createPool({ 主机:'xxxxx', 用户:'xxxxx', 密码:'xxxxx', 连接限制:100 });

池可以自动连接,所以不要连接到您的数据库,只需

pool.query(sql,function(err,res){})

这样每个查询都使用一个连接,使用后该连接将自动关闭。

  • 使用 async wait 进行异步顺序查询。
  • 为此创建一个返回 Promise 的 getResult 函数

    function getResult(sql){
      return new Promise(function(resolve,reject){
        pool.query(sql, function(err, result){
          if(err){
            reject(err)
          }else{
            resolve(result)
          }
        })
      })
    }
    

    然后你可以等待循环中的每个查询

    pool.query(sql1, async function(err, result) {
      if (err) throw err;
      for (var i = 0; i < result.length; i++) {
        var db_name = result[i].db_name;
          console.log(db_name);
          var sql = sql2.replace("{0}",db_name)
          var res = await getResult(sql)
          console.log(db_name+','+res[0].solution); //Here db_name is showed only the last one.
      };
      pool.end()
    });
    

    P.S.:异步等待是 4 月份即将发布的 Node 8.0.0 版本的一项功能。对于 Node 7.x,您必须使用命令行开关启动脚本

    node --harmony-async-await yourscript.js
    

    关于mysql - Nodejs Mysql 中的嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41628900/

    相关文章:

    html - NodeJS - 如何将相同的视频流传输到多个客户端?

    node.js - 无法从 session 存储中获取 session

    node.js - 将 SSL 添加到 CometD

    mysql - 应用程序无法在 ubuntu 上启动,但在 windows 上启动没有任何问题

    c# - 使用 linq Skip 和 Take 显示记录时如何避免重复输入

    node.js - 无法在 Azure Web App 上安装 StackImpact

    javascript - 如果在其他浏览器选项卡中写入,则数据绑定(bind)到我的应用程序

    php - 未找到结果/找到结果

    MYSQL 选择其中时间间隔返回早于查询的行

    MYSQL Rank 分区