如何多次循环 MYSQL 查询并 return 来自 node.js 中每个循环查询的数据?
How do I loop a MYSQL query multiple times and return the data from each looped query in node.js?
我有一个名为 Inventory
的 table 数据库,它有五列:主键、sku、项目名称、描述和价格。我还有一组名为 skus
的 SKU。我的目标是 运行 一个 for 循环并使用每个 SKU 多次查询 Inventory
table 以收集每个 SKU 的每一列的所有信息,然后输出它。
我对 Node 的异步特性还很陌生,我无法首先从我的 table 获取所有数据,然后在所有数据收集和整理后输出。
这是我的代码:
var skus = [2, 1, 3, 4];
function inventoryLoop() {
for(var i=0; i<skus.length; i++)
{
var deferred = Q.defer();
connection.query("select * from Inventory where SKU = '"+skus[i]+"'", function(err, rows, fields) {
deferred.resolve(rows);
}); //connection.query
} //for-loop
return deferred.promise;
} //inventoryLoop()
Q.all(inventoryLoop()).then(function(results) {
console.log("results");
console.log(JSON.stringify(results));
}); //Q.all
这是我的输出:
[
{"inventoryObjectID":2,"SKU":"2","itemName":"Lego 2","description":"Lego 2 Description","price":2}
]
这是我正在寻找的输出:
Results
[
{"inventoryObjectID":2,"SKU":"2","itemName":"Lego 2","description":"Lego 2 Description","price":2}
{"inventoryObjectID":1,"SKU":"1","itemName":"Lego 1","description":"Lego 1 Description","price":1}
{"inventoryObjectID":3,"SKU":"3","itemName":"Lego 3","description":"Lego 3 Description","price":3}
{"inventoryObjectID":4,"SKU":"4","itemName":"Lego 4","description":"Lego 4 Description","price":4}
]
如果您遍历列表以单独获取每个项目的信息,您最终将对数据库执行多个查询。相反,您可以创建一个更复杂的查询,它将为您提供所需的所有信息,从而减少您执行的查询次数。
在你的例子中,因为你有一个 sku
的列表,你可以 运行 一个查询,它获取与 sku
匹配的所有行。您可以使用以下查询来做到这一点:
SELECT * FROM Inventory WHERE SKU='1' OR SKU='2' OR SKU='3' OR SKU='4'
您可以创建一个更好的查询来产生相同的输出,如下所示:
SELECT * FROM Inventory WHERE SKU IN ('1','2','3','4')
因此,您可以按如下方式编写查询并避免遍历列表:
connection.query("SELECT * FROM Inventory WHERE SKU IN ("+skus+")",
function(err, rows, fields) {...});
我有一个名为 Inventory
的 table 数据库,它有五列:主键、sku、项目名称、描述和价格。我还有一组名为 skus
的 SKU。我的目标是 运行 一个 for 循环并使用每个 SKU 多次查询 Inventory
table 以收集每个 SKU 的每一列的所有信息,然后输出它。
我对 Node 的异步特性还很陌生,我无法首先从我的 table 获取所有数据,然后在所有数据收集和整理后输出。
这是我的代码:
var skus = [2, 1, 3, 4];
function inventoryLoop() {
for(var i=0; i<skus.length; i++)
{
var deferred = Q.defer();
connection.query("select * from Inventory where SKU = '"+skus[i]+"'", function(err, rows, fields) {
deferred.resolve(rows);
}); //connection.query
} //for-loop
return deferred.promise;
} //inventoryLoop()
Q.all(inventoryLoop()).then(function(results) {
console.log("results");
console.log(JSON.stringify(results));
}); //Q.all
这是我的输出:
[
{"inventoryObjectID":2,"SKU":"2","itemName":"Lego 2","description":"Lego 2 Description","price":2}
]
这是我正在寻找的输出:
Results
[
{"inventoryObjectID":2,"SKU":"2","itemName":"Lego 2","description":"Lego 2 Description","price":2}
{"inventoryObjectID":1,"SKU":"1","itemName":"Lego 1","description":"Lego 1 Description","price":1}
{"inventoryObjectID":3,"SKU":"3","itemName":"Lego 3","description":"Lego 3 Description","price":3}
{"inventoryObjectID":4,"SKU":"4","itemName":"Lego 4","description":"Lego 4 Description","price":4}
]
如果您遍历列表以单独获取每个项目的信息,您最终将对数据库执行多个查询。相反,您可以创建一个更复杂的查询,它将为您提供所需的所有信息,从而减少您执行的查询次数。
在你的例子中,因为你有一个 sku
的列表,你可以 运行 一个查询,它获取与 sku
匹配的所有行。您可以使用以下查询来做到这一点:
SELECT * FROM Inventory WHERE SKU='1' OR SKU='2' OR SKU='3' OR SKU='4'
您可以创建一个更好的查询来产生相同的输出,如下所示:
SELECT * FROM Inventory WHERE SKU IN ('1','2','3','4')
因此,您可以按如下方式编写查询并避免遍历列表:
connection.query("SELECT * FROM Inventory WHERE SKU IN ("+skus+")",
function(err, rows, fields) {...});