描述: 我对表执行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();
});
答案 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
});