2013-04-09 87 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 2013-04-09 10:37:15

回答

4

您需要一个cron job(不确定Yii是否具有使这更容易的功能)。

PHP

基本上你需要写一个PHP脚本,重新数票,并将其放入一个单独的表,你需要一个脚本来运行每隔一小时,多久你想让它。

cron命令会是这样的:

php updateRatings.php 

MySQL的

您可以使用类似于下一个作为cron的命令。

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) 

随着包含列号shop_idrating的表tbl_averages。

+0

非常感谢您的回复,我想我会尝试去使用MySQL选项 – kokoseq 2013-04-09 10:46:52

+0

不客气。添加了一个可以使用的查询,我用你发布的表格(以及我制作的一个新表格)对它进行了测试,并且它可以工作。 – 2013-04-09 10:59:09

+0

很亲切,谢谢! – kokoseq 2013-04-09 11:30:30