我正在查询我的数组,我得到了一些结果(10)。我想每次使用查询来获得相同的结果,因为这些是我的tableView数据。但是当我尝试计算每个的平均评级时,我的表每次重新排列,因为它是异步的。我可以保留查询结果中的原始序列吗?
connection.query('SELECT * FROM `movies` WHERE `genres` = "'+genre+'" ORDER BY `movieId` DESC LIMIT 10 OFFSET '+count+'', function(err, result) {
if (err) throw err;
result.forEach(function(movie) {
getAverageRating(movie["movieId"],movie["title"], function (data) {
dataModel.push({
movieId: movie["movieId"],
title: movie["title"],
averageRating: data
});
if (dataModel.length==10) {
response.send(dataModel);
}
});
});
});
function getAverageRating (movieId,movieTitle,callback) {
connection.query('SELECT * FROM `ratings` WHERE `movieId` = ?',[movieId], function(err, result) {
if (err) {
return callback(err);
}
var sum = 0;
result.forEach(function(movie) {
sum += movie["rating"];
});
var data = (sum / result.length);
callback(data);
});
}
答案 0 :(得分:1)
您可以在一个查询中选择具有平均评分的电影,它会更快,不会导致重新排列。使用这样的查询:
SELECT m.movieId, m.title, AVG(rating) avg_rating
FROM (SELECT * FROM movies ORDER BY movieId DESC LIMIT 10 OFFSET 10) m, ratings r
WHERE m.movieId = r.movieId
GROUP BY m.movieId, m.title
答案 1 :(得分:0)
您可以使用索引
将数据设置为数组result.forEach(function(movie, i) {
getAverageRating(movie["movieId"], movie["title"], function (data) {
dataModel[i] = {
movieId: movie["movieId"],
title: movie["title"],
averageRating: data
});