рассчитать среднее значение по рейтинговой системе

Я хочу рассчитать среднее значение для рейтинговой системы, но у меня есть обычная таблица в innodb и один столбец в json с именем: "reviews" с такой структурой:

{"comments": 
    [
        {"name": "Jonh", "text": "nice phone", "star": 4}, 
        {"name": "igon", "text": "not good", "star": 2}, 
        {"name": "marco", "text": "i not like this", "star": 3},
        {"name": "david", "text": "good product", "stelle": 5}
    ]
}

Теперь мне нужно рассчитать среднюю звезду. это в sql или в php? В sql я не знаю, как, в php у меня проблема с запросом для извлечения только всей звезды, например:

$reviews_nn = $rowprod["reviews"];
$reviews = json_decode($reviews_nn,true);
$max = 0;
$n = 0;
foreach ($reviews[comments][star] as $rate => $count) {
    echo 'Seen ', $count, ' ratings of ', $rate, "\n";
    $max += $rate * $count;
    $n += $count;
}
echo 'Average rating: ', $max / $n, "\n";

Но результат NAN ... Разве не целое? Это целое число в звездочке ...
звездочка = 4
не звездочка = "4"

Надеюсь, вы мне поможете .... Танки !!!


person user112752    schedule 31.03.2016    source источник
comment
что это $reviews_nn = $rowprod["reviews"];? а также $reviews['comments']['star'] as $rate => $count, но все равно это не сработает, я думаю   -  person Anant Kumar Singh    schedule 31.03.2016
comment
$reviews[comments][star] не массив .. конечно ..   -  person DevDonkey    schedule 31.03.2016
comment
Как это часто бывает, решение состоит в нормализации данных.   -  person symcbean    schedule 31.03.2016


Ответы (2)


Ваш код совершенно непонятен, но я создаю для вас пример и думаю, что он поможет решить вашу проблему: -

<?php
$data = '{"comments": [{"name": "Jonh", "text": "nice phone", "star": 4}, {"name": "igon", "text": "not good", "star": 2}, {"name": "marco", "text": "i not like this", "star": 3}, {"name": "david", "text": "good product", "stelle": 5}]}'; // your json data

//$reviews_nn = $rowprod["reviews"]; // i don't get from where you are getting this
$reviews = json_decode($data,true); // decode the json data
$max = 0;
$n = count($reviews['comments']); // get the count of comments
echo "<pre/>";print_r($reviews); // print json decoded data
foreach ($reviews['comments'] as $rate => $count) { // iterate through array
$max = $max+$count['star'];
}
echo 'Average rating: ', $max / $n, "\n";
?>

Вывод: - https://eval.in/545582

Примечание: - Я взял ваши json данные, но изменил имя переменной. Надеюсь, мне легко понять, что происходит в моем коде. Спасибо.

person Anant Kumar Singh    schedule 31.03.2016

$reviews_nn = $rowprod["reviews"];
$reviews = json_decode($reviews_nn,true);
$numberOfReviews = 0;
$totalStars = 0;
foreach($reviews['comments'] as $review)
{
    $numberofReviews++;
    $totalStars += $review['star'];
}
$average = $totalStars/$numberOfReviews;
echo 'Average rating: '.$average;

Это должно сработать.

person lshas    schedule 31.03.2016