Подсчет среднего значения рейтинга

Я работаю над веб-сайтом с 10-звездочной рейтинговой системой. Все рейтинги хранятся в tbl_rating и имеют атрибуты:

id
heading
description
rating (number of stars, 1 to 10)
shop_id (each rating belongs to a shop - my site is a catalog of shops)

Мой вопрос: как лучше всего подсчитать средний рейтинг для магазина (в основном мне нужно только суммировать все оценки с определенным shop_id и разделить их на количество этих оценок). В каждом магазине есть столбец avg_rating, в котором я могу сохранить значение.

Есть ли способ указать базе данных MySql подсчитывать эту статистику каждый час? Должен ли я подсчитывать его после каждого нового выставленного рейтинга или даже при каждом запросе атрибута магазина avg_rating? Есть ли способ указать базе данных делать это автоматически или мне нужно запускать эти действия из PHP? Я использую PHP, Yii framework и базу данных MySQL.

Спасибо за любую помощь.


person kokoseq    schedule 09.04.2013    source источник
comment
Вы всегда можете использовать cron для запуска php скрипта каждый час, который его вычисляет.   -  person chriz    schedule 09.04.2013


Ответы (1)


Вам понадобится задание cron (не уверен, есть ли у Yii функции, упрощающие эту задачу).

PHP

По сути, вам нужно написать PHP-скрипт, который пересчитывает голоса и помещает их в отдельную таблицу, и вам нужно, чтобы этот скрипт запускался каждый час или, как часто вы этого хотите.

Команда cron будет выглядеть примерно так:

php updateRatings.php

MySQL

Вы можете использовать команду, аналогичную следующей, как cron.

mysql -h HOST -u USER -pPASS -e "UPDATE ..."

Для фактического запроса SQL - вы должны проверить этот вопрос: MySQL - запрос UPDATE на основе ВЫБРАТЬ запрос

ОБНОВЛЕНИЕ:

Вы можете использовать такой запрос:

UPDATE
    tbl_averages ta
SET 
    rating =
    (SELECT 
        AVG(tr.rating)
    FROM 
        tbl_rating tr
    WHERE 
        ta.shop_id = tr.shop_id)

С таблицей tbl_averages, содержащей столбцы shop_id и rating.

person Vlad Preda    schedule 09.04.2013
comment
большое спасибо за ответ, думаю, я попробую использовать вариант MySQL - person kokoseq; 09.04.2013
comment
Пожалуйста. Добавлен запрос, который вы можете использовать, я протестировал его с таблицей, которую вы опубликовали (и с новой, которую я сделал), и она работает. - person Vlad Preda; 09.04.2013