Я пытаюсь отобразить и отсортировать массив по средству, созданному с использованием данных из базы данных. Я извлекаю три переменные из базы данных и создаю среднее из этих значений. Это значение затем помещается в новый массив, который нужно сортировать вместе с остальными данными базы данных.Возможно ли создать вызов базы данных за пределами требуемого цикла?
Я правильно понял, что наличие 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 объектов, в то время, но со временем это может измениться, так что у меня глаз на производительности так много как я могу.
Вы правы, запрос, выполняемый в цикле, станет узким местом для производительности. можно сделать все это с помощью одного запроса sql, расширив исходный запрос, который получает бизнес-список, присоединившись к таблице рейтингов и используя функцию AVG от MySQL, и GROUP BY. – flauntster
Итак, чтобы получить сервис, ценность и качество из исходного запроса, просто выполните вычисления в цикле вместо этого? Хм! Я попробую! – potts
Фактически функция AVG в mysql может использоваться для вычисления средних оценок, и если вы ищете общий рейтинг и количество оценок для каждого бизнеса, ознакомьтесь с функциями SUM и COUNT. Пусть база данных сделает для вас работу только в одном запросе :) – flauntster