4

私は、10 の星評価システムを備えた Web サイトに取り組んでいます。すべての評価は 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 列もあります。

この統計を 1 時間ごとにカウントするように MySql データベースに指示する方法はありますか? 新しい評価が送信されるたびに、またはショップ属性 avg_rating が照会されるたびに、それをカウントする必要がありますか? データベースにこれを自動的に行うように指示する方法はありますか、またはこれらのアクションを PHP から実行する必要がありますか? PHP、Yii フレームワーク、および MySQL データベースを使用しています。

助けてくれてありがとう。

4

1 に答える 1

5

cron ジョブが必要です(Yii にこれを簡単にする機能があるかどうかはわかりません)。

PHP

基本的に、投票を再カウントして別のテーブルに配置する PHP スクリプトを作成する必要があり、そのスクリプトを 1 時間ごと、または必要な頻度で実行する必要があります。

cron コマンドは次のようになります。

php updateRatings.php

MySQL

次のようなコマンドを cron として使用できます。

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

実際の SQL クエリについては、次の質問を確認する必要があります: MySQL - SELECT クエリに基づく UPDATE クエリ

アップデート:

次のようなクエリを使用できます。

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

shop_idcolsとを含むテーブル tbl_averages を使用しますrating

于 2013-04-09T10:37:00.923 に答える