Подсчитать общий Средний рейтинг с PHP

Как мне выполнить запрос PDO, а затем обработать результаты с помощью PHP для вывода средней оценки для определенного пустого на основе отзывов, введенных пользователем?

Каждый отзыв оценивается по 2 критериям: услуга и цена. Оба эти значения равны 0-5, поэтому конечное среднее значение взвешивается по 10-балльной шкале. В настоящее время я использую следующий код для расчета среднего рейтинга для конкретного обзора.

$rating_total = $row['review_service_rating'] + $row['review_price_rating'];

$average_rating = ($rating_total / 100) * 100; 

Таким образом, для каждого обзора есть 2 строки sql для review_service_rating и review_price_rating, оба из которых находятся из 5.

Однако я не совсем уверен, как подсчитать все оценки, а затем определить базовую оценку для конкретной страницы из 10.

Допустим, у нас есть 3 отзыва. Это обзоры 7/10, 8/10 и 10/10. По логике, мы должны сложить все числа, а затем сложить все / 10, что даст нам. 25/30, что соответствует 83,33 или в моем случае 8/10. Это 2 шага, которые я не знаю, как это сделать.

1 - Получите все оценки из SQL и посчитайте их

2 - Определить среднее / 10 на основе всех оценок

Текущий код PDO для извлечения данных из БД, а также подсчет количества обзоров, имеющихся у каждого конкретного пользователя.

$q = $db->prepare("SELECT * FROM reviews WHERE assigned_id = :review_id ORDER BY review_posted DESC");
         $q->execute(array(':review_id' => $_GET['page_id']));

         $r = $q->fetchAll(PDO::FETCH_ASSOC);

         echo '<br><div class="well">Average Rating</div><br>';

         foreach($r as $row) {

         $q = $db->prepare("SELECT * FROM users WHERE user_id = :review_user_id");
         $q->execute(array(':review_user_id' => $row['user_id']));
         $r = $q->fetch(PDO::FETCH_ASSOC);

         $q = $db->prepare("SELECT COUNT(*) FROM reviews WHERE user_id = :review_user_id");
         $q->execute(array(':review_user_id' => $row['user_id']));
         $user_reviews = $q->fetchColumn();

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения


person Community    schedule 29.06.2017    source источник
comment
Разве $average_rating = ($rating_total / 100) * 100 не просто $rating_total?   -  person ctwheels    schedule 29.06.2017
comment
Я продолжаю видеть PDO в тегах и вопросе, но не вижу ничего, связанного с базой данных. Базы данных могут рассчитать для вас среднее значение в большинстве случаев   -  person apokryfos    schedule 29.06.2017
comment
@ctwheels относится к добавленному мной изображению   -  person    schedule 29.06.2017
comment
@apokryfos добавил мой текущий SQL и несколько изображений, чтобы объяснить, что происходит   -  person    schedule 29.06.2017
comment
Не могли бы вы объяснить структуру вашей обзорной таблицы. Очень непонятно   -  person apokryfos    schedule 29.06.2017
comment
@apokryfos как непонятно? 1-й SQL получает все данные из БД для страницы обзора, затем мы запускаем цикл foreach, что означает, что он будет извлекать данные для каждой базы обзора (та же концепция, что и сообщения на форуме, нет?) В цикле foreach мы извлекаем данные пользователя и связываем их с идентификатор рецензента, указанный в таблице обзора. И последняя строка в foreach подсчитывает строки в обзорах по идентификатору пользователя, чтобы определить, сколько всего обзоров у пользователя X. Опять же, прочитав, это довольно просто, tbh   -  person    schedule 29.06.2017
comment
Разве SELECT ( AVG(review_service_rating) + AVG(review_price_rating) ) AS average_rating, COUNT(review_service_rating) AS num_service_rating, COUNT(review_price_rating) AS num_price_rating FROM reviews WHERE assigned_id = :review_id ORDER BY review_posted DESC тебе не пригодится? Так как средние значения варьируются от 0 до 5, простое их сложение даст вам сумму от 0 до 10.   -  person Alejandro Iván    schedule 29.06.2017
comment
@ AlejandroIván интересно. Однако мне все еще нужны значения услуг и цен для индикатора выполнения, потому что индикатор выполнения составляет от 0 до 100%, поэтому в любом случае мне все равно нужно будет вызвать оба из них, а затем превратить 8/10 в 80% для прогресса загрузки. панель для правильной визуализации данных.   -  person    schedule 29.06.2017
comment
@ 0111010001110000 у вас есть. По мере того, как вы добавляете средние значения, результат будет ниже 10. Поэтому, если вы получите 7.1, просто добавьте строку /10. Если вам нужен процент, ( 7.1 / 10 ) * 100 (= 71%) предоставит его вам.   -  person Alejandro Iván    schedule 29.06.2017
comment
@ 0111010001110000 Предлагаю вам сделать шаг назад и пересмотреть свой подход. Мне кажется, вы сделали простое соединение в цикл и множество запросов. Слова, которые вы используете взвешенное и среднее, на самом деле не то, с чем вы здесь имеете дело. Вы просто складываете 2 числа.   -  person apokryfos    schedule 29.06.2017
comment
@apokryfos в значительной степени. Как я уже сказал, я просто любитель, делаю это для развлечения, поэтому мой код немного похож на этот.   -  person    schedule 29.06.2017


Ответы (2)


Предположим, что каждый пользователь дает x баллов (ограничение на 10), вы должны просуммировать их (x), затем разделить его на rating_times, и вы получите средний рейтинг.

Например

 User 1 rate 7
 User 2 rate 6 
 User 1 rate 5

 => (7+6+5)/3 = 6

Таким образом, вы просто добавляете еще одно поле при оценке пользователей под названием балл. Затем используйте запрос SUM to SUM точку вверх, разделенный запросом COUNT, а затем выполненным. забудьте про (x ** / 10 **).

Наконец, используйте 2 средних оценки (цена и услуга), их сумму, разделенную на 2, и вы получите общую оценку.

person Huy Trịnh    schedule 29.06.2017
comment
Итак, насколько я понимаю, мне нужно было бы добавить критерий № 1 (услуга) и критерий № 2 (цена), это даст мне значение из 10 комбинированных баллов (каждый критерий взвешивается по 5). После этого у меня было бы общее количество обзоров PHP для, скажем, мастерской по ремонту мотоциклов Джейка. SQL вернет 3 отзыва. После этого я просто запускал математику. - person ; 29.06.2017
comment
Что-то вроде этого? function sum($a, $b) { return $a + $b; } $average_rating = explode('.', (string)(array_reduce($ratings, 'sum') / sizeof($ratings)))[0] . '%'; - person ; 29.06.2017

Вот что вы, вероятно, хотели сделать:

$q = $db->prepare("
      SELECT * 
      FROM review r 
          JOIN users u ON r.user_id=u.id  
          JOIN (SELECT user_id, COUNT(1) as count FROM review GROUP BY user_id) uc ON uc.user_id = u.id 
      WHERE r.assigned_id=:review_id 
      ORDER BY r.review_posted DESC");
$q->execute(array(':review_id' => $_GET['page_id']));
$r = $q->fetchAll(PDO::FETCH_ASSOC);

foreach ($r as $row) {
     // $row should have all fields included in $tables review and users as well as $row[count] would contain the total number of reviews a user made
}

Это будет включать сведения о пользователе вместе с рейтингом для каждого отзыва с этим assigned_id

Изменить: также добавлена ​​сумма отзывов пользователей.

person apokryfos    schedule 29.06.2017
comment
Пытался добавить свой код, страница сломалась, ха-ха. В любом случае, вот полный код страницы обзора. pastebin.com/raw/0m8b7Ycq - person ; 29.06.2017
comment
@ 0111010001110000, возможно, стоит сделать print_r($r); die(), чтобы увидеть, как выглядит результат этого запроса (если он работает, я его не тестировал), и посмотреть, можно ли с этим работать. - person apokryfos; 29.06.2017
comment
Изменил значения на правильные значения, и он работает. Немного глупый вопрос, но что мне теперь использовать для отображения x отзывов для каждого пользователя? - person ; 29.06.2017