2011-02-04 15 views
5

私は2つのMySQLテーブルを持っています。投票テーブル(id, userId, postId, voteTypeId)と投稿テーブル(id, postTypeId, userId, parentId)テーブル。私は票の上に挿入した後に起動するトリガを書いています。トリガーを使用してMySQLの別のテーブルを更新するにはどうすればよいですか?

私は、投稿テーブルの投稿を更新するトリガーを希望します。しかし、この投稿はpostIdの私の投票表で参照されているものと同じではありません。それはその投稿の親です。

BEGIN 
CASE NEW.voteTypeId 
    WHEN 2 THEN UPDATE posts SET posts.acceptedAnswerId = NEW.postId WHERE posts.id = @the parent postId of NEW.postId 
    ELSE 
     BEGIN 
     END; 
    END CASE; 
END 

私は...代わりに@The親の本を使用してみました:

(SELECT posts.parentId FROM posts WHERE posts.id = NEW.postId) 

しかし、あなたは私はあなたがSELECT INTO構文のいくつかのタイプを使用しない限り、あなたはトリガーでSELECTSを行うことができるとは思いません。私が更新したい親投稿への私の唯一の参照は、参照された票の子postIdです。だから私はselectを使って正しいidを取得せずに更新を行う方法を知らない。

これは可能ですか?

+0

あなたが実際にトリガー内でSELECTを行うことができます。しかし、あなたの他の構文は少し外見になります。 – Mchl

+0

@Mchl、私はいくつかの組み合わせを試しましたが、うまくいきませんでした。私が間違っていることを私に指摘できますか? – Mohamad

答えて

2

私はそのようにそれを行うだろう:

BEGIN 
    IF (NEW.voteTypeId = 2) THEN 
    UPDATE 
     posts AS p 
    CROSS JOIN 
     posts AS p2 
    ON 
     p.id = p2.parentId 
    SET 
    p.acceptedAnswerId = NEW.postId 
    WHERE 
    p2.id = NEW.postId; 
    END IF; 
END 
+0

それに感謝します。なぜあなたはクロス・ジョインを使用するのか尋ねることはできますか?なぜエイリアスとの通常の結合ではないのですか? – Mohamad

+1

MySQLでは「INNER JOIN」と「CROSS JOIN」と「JOIN」はすべて同等です。実際、ANSI SQL仕様によれば、ここで 'INNER JOIN'を使用していたはずです(USING()の代わりに' ON'結合条件を使用したため)。機能的には違いはありませんが、移植性が損なわれる可能性があります。 – Mchl

関連する問題