2012-02-28 3 views
2

プロジェクトテーブル3つのテーブルと条件文を含むトリガを作成することは可能ですか?

+-----------+---------------------+-------------------------------------------------+ 
| id  | project name  |status (1 confirmed/2 in progress/3 done) | 
+-----------+---------------------+-------------------------------------------------+ 
| 233  | project 1   |1            | 
+-----------+---------------------+-------------------------------------------------+ 
| 234  | project 2   | 3            | 
+-----------+---------------------+-------------------------------------------------+ 

表2があり、私は私のデータベースに3つのテーブルを持っており、それらはすべて互いに

に依存しているカテゴリ

+-----------+---------------------+-------------------+-------------------+-------------------+ 
| id  | category   | confirmed_counter | inprogress_counter|done_counter  | 
+-----------+---------------------+-------------------+-------------------+-------------------+ 
|   1 | c++     |  2   |3     | 1     | 
+-----------+---------------------+-------------------+-------------------+-------------------+ 
|   2 | php     |  3   |4     | 6     | 
+-----------+---------------------+-------------------+-------------------+-------------------+ 

及び表3は、カテゴリですオブジェクト

+-----------+---------------------+------------+ 
| id  | project_id   | category_id| 
+-----------+---------------------+------------+ 
|   1 | 233     |  2  | 
+-----------+---------------------+------------+ 
|   2 | 244     |  3  | 
+-----------+---------------------+------------+ 

私はトリガを作成したい管理者は、プロジェクトを確認すると、プロジェクトのステータスは

を変更すると、それはステータスが confirmed_counterが をインクリメントしなければならないので、カテゴリテーブルに1に変更されます、カテゴリのカウンタを更新するが、最初に私はカテゴリオブジェクトを調べて、カテゴリが何であるかを見るために持っていますか、そのプロジェクトのカテゴリーは、その後、これらのカテゴリ

$c = $project->get_categorys(); 
///// it returns array of that project category ids (2 ,3 ,4) 
$sql = update `categorys` set `confirmed_counter` = confirmed_counter+1 where `id` in (2,3,4); 

とプロジェクトが進行中である

$sql = update `categorys` set `confirmed_counter` = confirmed_counter-1 , `inprogress_counter` = inprogress_counter+1 where `id` in (2,3,4); 

のカウンタフィールドを更新しますプロジェクトは

$sql = update `categorys` set `inprogress_counter` = inprogress_counter-1 , `done_counter` = done_counter+1 where `id` in (2,3,4); 

を行われ、それが進行

でいたときに、プロジェクトがリセットされてしまうかもしれませんそのため に常にないときなど、カウンタに

最初のiを更新する前に2の重要なステップがあります3番目のテーブルからプロジェクトのカテゴリIDを取得する必要があります

私はプロジェクトの現在お​​よび以前のステータスに基づいてカウンターを増減する必要があります

これを行うためのトリガーを作成することは可能ですか?

///////////////////////////////////////////////////////////////////////////// ////編集/////////////////////////

直前の状態を想定して、コード内でOLDを使用して指定しますか?

SET 
    confirmed_counter = 
     CASE NEW.status 
     WHEN 1 THEN confirmed_counter + 1 
     ELSE confirmed_counter 
     END, 

    confirmed_counter = 
     CASE OLD.status 
     WHEN 1 THEN confirmed_counter - 1 
     ELSE confirmed_counter 
     END, 

SET 
    confirmed_counter = 
     CASE NEW.status 
     WHEN 1 THEN confirmed_counter + 1 
     WHEN 2 THEN confirmed_counter - 1 
     ELSE confirmed_counter 
     END, 

を変更するように私はこのようにそれを使用しようとしたが、常に最後の文は、それが可能にはい

答えて

1

を実行しているようだ -

CREATE TRIGGER trigger1 
    AFTER UPDATE 
    ON project 
    FOR EACH ROW 
BEGIN 
    UPDATE category c 
    JOIN category_objects co 
     ON co.category_id = c.id 
    SET 
    confirmed_counter = 
     CASE NEW.status 
     WHEN 1 THEN confirmed_counter + 1 
     WHEN 2 THEN confirmed_counter - 1 
     ELSE confirmed_counter 
     END, 
    inprogress_counter = 
     CASE NEW.status 
     WHEN 1 THEN inprogress_counter 
     WHEN 2 THEN inprogress_counter + 1 
     ELSE inprogress_counter - 1 
     END, 
    done_counter = 
     CASE NEW.status 
     WHEN 1 THEN done_counter 
     WHEN 2 THEN done_counter 
     ELSE done_counter + 1 
     END 
    WHERE 
    co.project_id = NEW.id; 
END 

は、例2番目の質問に:

... 
confirmed_counter = 
    CASE 
    WHEN NEW.status = 1 THEN confirmed_counter + 1 
    WHEN OLD.status = 1 THEN confirmed_counter - 1 
    ELSE confirmed_counter 
END 
.... 
+0

ありがとう、私は私の質問あなたはCASEのstatamentの第二のバージョンを使用することができます – max

+0

を見てご利用ください更新しました - [条件]は、結果THEN [条件] [結果CASEを... ] [ELSE result] END。詳細 - http://dev.mysql.com/doc/refman/5.5/en/control-flow-functions.html – Devart

+0

私は例を追加しました。 – Devart

関連する問題