【发布时间】:2015-05-16 22:09:35
【问题描述】:
我正在尝试按使用数据库中的数据创建的平均值来显示和排序数组。我正在从数据库中检索三个变量并从这些值中创建一个平均值。然后将该值放入一个新数组中,以便与其余数据库数据一起排序。
我是否认为在循环中包含 SQL 查询不是一个好主意? (性能问题?)
有没有其他可用的替代方案?我附上了以下代码:
^ database connection/query string to retrieve all data...
$result = $stmt_business_list->fetchAll(PDO::FETCH_ASSOC);
$items = array();
foreach($result as $row){
$single_business_id = $row['id'];
$name = $row['name'];
//Query to get ALL the service, value and quality ratings for certain business
$test_query = "SELECT * FROM rating WHERE business_id = $single_business_id";
$test_query_stmt = $dbh->prepare($test_query);
$test_query_stmt->execute();
$test_row = $test_query_stmt->fetchAll(PDO::FETCH_ASSOC);
$total_value = $total_quality = $total_service = 0;
foreach($test_row as $review)
{
$total_value += $review['value'];
$total_quality += $review['quality'];
$total_service += $review['service'];
}
$bayesian_value = (($set_site_average_review_count * $set_site_average_review_score) + $total_value) / ($set_site_average_review_count + $business_review_count);
$bayesian_quality = (($set_site_average_review_count * $set_site_average_review_score) + $total_quality) / ($set_site_average_review_count + $business_review_count);
$bayesian_service = (($set_site_average_review_count * $set_site_average_review_score) + $total_service) / ($set_site_average_review_count + $business_review_count);
$average_bayesian_rating = ($bayesian_value + $bayesian_quality + $bayesian_service) / 3;
$average_bayesian_rating = $average_bayesian_rating;
array_push($items, array(
"id"=>"$single_business_id",
"name"=>"$name",
"value"=>"$total_value",
"quality"=>"$total_quality",
"service"=>"$total_service",
"average"=>"$average_bayesian_rating"));
echo
'Name: '.$name.'<br>
Value: '.$total_value.'<br>
Quality: '.$total_quality.'<br>
Service: '.$total_service.'<br>
Average: '.$average_bayesian_rating.'<br><br>';
}
}
该页面将由一个单独的分页脚本拆分,一次仅显示 6 个对象,但随着时间的推移,这可能会发生变化,因此我会尽可能多地关注性能。
【问题讨论】:
-
你是对的,在循环中运行查询将成为性能瓶颈。通过扩展获取业务列表的原始查询、加入评级表并使用 MySQL 的 AVG 函数和 GROUP BY,可以使用一个 sql 查询来完成所有这些操作。
-
那么要从原始查询中获取服务、价值和质量,然后只需在循环中进行计算吗?唔!我会试试这个!
-
其实mysql中的AVG函数可以用来计算平均收视率,如果您要查找每个业务的总评分和评分数,请查看SUM和COUNT函数。让数据库在一个查询中为您完成工作:)
-
这是我所追求的特殊类型的平均值,这就是问题所在 - 这不是通常的平均值,它是加权的 - '贝叶斯平均值'