node.js / javascript在其他数组中添加一个数组作为子

时间:2015-11-26 14:21:24

标签: javascript mysql node.js

描述: 我对表执行mysql查询,然后返回一些行

>   connection.query(q2,function(err,rows){...}

我们可以说这些行看起来像{id:",,,", time:"..." etc:"cc"} 接下来每行我查询另一个表并返回一些让我们说coms基于行的id。在查询中可以有0到100行

> for (var i = 0; i < rows.length; i++){   
> connection.query(qc,function(err2,coms){

让我们说com看起来像这样{ rowid:",,,", something:"ddd" smthelse:"ff"} 每行还可以有0到100个com 问题:

我如何在行内添加com,所以对于每一行我都有从表中返回的com? 我想要这样的东西

> {id:"1", time:"..." etc:"cc" coms:{ rowid:",,,", something:"ddd"
> smthelse:"ff"}}

已经尝试过: rows[i].comms=coms;(不工作) rows[i].comms[j]=coms[j];(不工作) rows[i].push(coms)(不工作) rows.comms=coms;(工作,但不是我想要的。用这个我得到多次相同的数据)

我在第一次查询后使用的整个代码

 connection.query(q2,function(err,rows){
                    //      connection.release();
                            if(!err) {
                            //      rows["coms"]=[];
                                    for (var i = 0; i < rows.length; i++){
                                            var qc="select * from comms where id='"+rows[i].id+"' order by com_id";
                                            connection.query(qc,function(err2,coms){
                                             if(!err2) {
                                             // rows[i].cid=coms.com_id;
                                             //     rows[i].coms=[];
                                                    rows[i]="coms";
                                                    for (var j = 0; j < coms.length; j++){
                                                    // data[i][j]=coms[j];
                                              //    rows[i].coms[j]=coms[j];
                                                    //  rows[i][j].coms=coms[j];
                                                    }
                                    //         data[i]=coms;
                                             // rows[i]["coms"]=coms;
                                    //        console.log(rows);                                
                                             }
                                            });
                                    }
                            //      rows.push(data);
                                      console.log(rows);
                                    users[index].emit('data',rows);
                            }
                            connection.release();
                    });

2 个答案:

答案 0 :(得分:1)

为什么不将第二个查询的WHERE id = row [i] .id更改为WHERE id IN(ids)以获取一次通过的数据。它在SQL Server上更容易,并且处理代码更容易。首先获取要传递给IN()条件的ID列表。当数据返回时,您可以遍历父行并过滤子节点行并作为所需属性附加到父节点。您可能希望使用underscorejs库来帮助您进行收集操作。

将所有子序列选择组合成一个选择将加快查询速度;因为它将摆脱对sql server进行连接和查询所需的所有头脑,直到一个连接和一个查询。想象一下,如果您的第一个查询返回100,1000,10,000行。您的SQL Server服务器将使用子序列查询的数量命中性能。

我不相信查询的最大长度;所以你可以对IN()条件中的Ids数量感到疯狂。

答案 1 :(得分:0)

我没有任何可用的MySQL数据库来测试这个,但我希望它可以解决问题或提出一些好主意。

var Promise = require("bluebird");

// This is a "promisified" version of connection.query
function query(con, sql) {
  return new Promise(function(resolve, reject) {
    con.query(sql, function(err, rows) {
      if (err) { reject(new Error(err)); }
      else { resolve(rows); }
    });
  });
}

您的代码现在会转换为以下内容:

query(connection, q2)
    .then(function(rows) {
        return Promise.map(rows, function(row) {
            var qc = "select * from comms where id='"+row.id+"' order by com_id";
            return query(connection, qc).then(function(coms) {
                // Do whatever you want with result of second query here
                row.coms = coms;
                return row;
            })
        })
    })
    .then(function(rows) {
        // All promises have resolved here, rows is an array of values
        users[index].emit('data', rows);
    })
    .catch(function(err) {
        // Handle errors here
    });