2012-02-08 12 views
2

私はCASEとJOINを使ってUPDATEを行う方法を理解していません。この例は私のDrupalデータベースからのものです。 content_typeのプライマリキーはnidです。一方、term_nodeは、同じnidが異なるtidに一致する複数の行を持つことができます。 MySQLは喜んでWHEREに基づいてクエリを解析します:MySQL UPDATE ...の正しい構文... JOIN ... CASE?

UPDATE `content_type` 
LEFT JOIN `term_node` USING(nid) 
SET 
    `field_m03` = 1 
    WHERE tid = 696; 

上記アップデートterm_node(tid = 696)にマッチしたnidを持ってcontent_typeのすべての行を、それが必要として。 しかし、私はCASEでいくつかの条件をストリングしようとすると動作しません。エラーはありませんが、影響を受ける行は0行です。

UPDATE `content_type` 
LEFT JOIN `term_node` USING(nid) 
SET 
    `field_m03` = (CASE 
    WHEN (tid = '696') THEN '1' 
    WHEN (tid = '697') THEN '2' 
    WHEN (tid = '698') THEN '3' 
    WHEN (tid = '699') THEN '4' 
    WHEN (tid = '700') THEN '5' 
    ELSE `field_m03` 
    END); 

括弧と一重引用符を使用せずに変更しても、変更は必要ありません。

+0

field_m03はどのテーブルですか? –

+0

'field_m03'は' content_type'テーブルからです –

答えて

1

構文が正しいようです。

MySQLサーバに安全なアップデート(SQL_SAFE_UPDATES)が有効になっている場合、サーバはWHEREまたはLIMIT句を持たないアップデートを中止します。

1

なぜ動作しないのか分かりませんが、もう一度考えてみることをお勧めします。

UPDATEにはフルテーブルスキャンが必要です。指定されたtidが実際に存在するtidのほんの小さなセットである場合、単一の更新ではインデックスを使用できます。

だから、単一UPDATE Sを発行する容易かつ安価であるかもしれない、あるいは少なくとも

... WHERE tid BETWEEN 696 AND 700 

UPDATEの範囲を制限します。

+0

WHERE句を入れてもCASEクエリが動作しました...... –

+1

@Pedro、確かに私の答えとSQL_SAFE_UPDATESの設定をチェックしてください。 –

0

テーブルでALIASを使用するとどうなりますか?

UPDATE `content_type` a 
LEFT JOIN `term_node` b USING(nid) 
SET 
    a.`field_m03` = (CASE 
    WHEN (b.tid = '696') THEN '1' 
    WHEN (b.tid = '697') THEN '2' 
    WHEN (b.tid = '698') THEN '3' 
    WHEN (b.tid = '699') THEN '4' 
    WHEN (b.tid = '700') THEN '5' 
    ELSE a.`field_m03` 
    END); 
+1

エイリアスでははっきりと読みやすくなりますが、これは解決策ではありません。フィールド名があいまいであれば、MySQLは文句を言うでしょう。 –