2013-04-09 1 views
3

Я работаю на веб-сайте, который имеет 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) 

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

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

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

+0

Вы всегда можете использовать 'cron' для запуска скрипта' php' каждый час, который его вычисляет. – chriz

ответ

4

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

PHP

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

Команда хрон будет что-то вроде:

php updateRatings.php 

MySQL

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

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

Для фактического запроса SQL - вы должны проверить этот вопрос: MySQL - UPDATE query based on SELECT Query

UPDATE:

Вы можете использовать запрос, похожее на это:

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

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

+0

Большое спасибо за ответ, я думаю, что постараюсь пойти с опцией MySQL. – kokoseq

+0

Добро пожаловать. Добавленный запрос, который вы можете использовать, я проверил его с таблицей, которую вы опубликовали (и новой, которую я сделал), и она работает. –

+0

очень хороший, спасибо! – kokoseq