2011-07-27 7 views
0

私は1日に1回発生するイベントがあります。私は2つのテーブルを持っている:Mysql、テーブルの各行をフェッチするには、次のクエリを変更する方法は?

  • アプリケーション
  • 評価

は基本的に、各アプリケーションは、テーブルの評価に格納されているユーザによって与えられたすべてのフィードバックの平均によって与えられるavg_scoreを有しますフィールドスコア。私は一日一回、この値を更新し、イベントを書きました:

CREATE EVENT MY_DAILY_UPDATE 
ON SCHEDULE EVERY 1 DAY STARTS '2011-07-23 23:30:00' 
DO 

    UPDATE application 
    SET `avg_score`= (SELECT AVG(`score`) as new_score 
         FROM `rating` 
         WHERE `ID_APPLICATION` = 1)  
    WHERE `APPLICATION_ID` = 1 

それは動作しますが、のみ= 1 IDを持つアプリケーションのために、私は自分でそれを書いた原因。 代わりに私はテーブルアプリケーションの各アプリケーションのフィールドavg_scoreを更新するために私のクエリが必要です。

私は変数ID(例WHERE APPLICATION_ID = ID_VARIABLE)で値1を変更する必要があると思います...この変数はアプリケーションテーブル(1、 2,3 ... 4など).......しかし、私はどのように私のクエリを変更するかについては考えていない.....

答えて

1

あなたのサブクエリを参照するように変更するクエリ。 (これはその相関サブクエリなります。)

UPDATE application 
SET avg_score = (
     SELECT AVG(score) 
     FROM rating 
     WHERE ID_APPLICATION = application.APPLICATION_ID 
     ) 

を別の方法として、あなただけのサブクエリに参加し、「すべての値」のためにこれをやっているよう...

UPDATE 
    application 
INNER JOIN 
(
    SELECT ID_APPLICATION, AVG(score) AS score FROM rating GROUP BY ID_APPLICATION 
) 
    AS averages 
    ON averages.ID_APPLICAITON = application.APPLICATION_ID 
SET 
    application.avg_score = averages.score 
+0

Tnx多くの人が両方の仕事をしています.......あなたはちょうどそれらの違いは私を説明することができます(2番目のものは私がSQL初心者だから理解するのが難しいです)?最初の方がはるかに簡単に見えます。もう1つ目は速くなります。使用することをお勧めしますか? – Sgotenks

+1

最初のものは、サブクエリをスカラ関数として効果的に使用し、ソーステーブル/クエリの各ローに対して適用します。 APPLICATION_IDを指定すると、AVG(スコア)は何ですか? 2番目のサブクエリはインラインビューとしてサブクエリを使用し、すべてのID_APPLICATIONのAVG(スコア)を取得し、アプリケーションテーブルと結合して、その結合の結果に対してUPDATEを実行します。私はより高速なものを使い、読み書き可能にする方法を見つける傾向があります。性能が似ている場合にのみ、私は読みやすさを得るために低性能を選択します。 – MatBailie

1
UPDATE application 
SET `avg_score`= 
    (SELECT AVG(`score`) as new_score 
    FROM `rating` 
    WHERE `ID_APPLICATION` = `application.APPLICATION_ID`) 
関連する問題