2012-02-02 5 views
1

メッセージテーブルでCASE文を使用しようとしています。最初のCASE文が真であるときに表示されたメッセージに印を付ける必要があります。従業員2がメッセージを削除する前にここで1つのクエリで追加のフィールド値を設定するMySQL CASE

UPDATE messages 
SET to_del=CASE WHEN to=2 THEN 1 ELSE to_del END, 
    from_del=CASE WHEN from=2 THEN 1 ELSE from_del END, 
WHERE company_id = '1' 

は次のとおりです。従業員2はメッセージを削除した後、ここで

company_id | to | from | to_del | from_del | viewed 
    1  4  2  0   0   0 
    1  2  4  0   0   0 

は次のとおりです。

これは動作しませんでしたが、それは似たようなあるべきしよう
company_id | to | from | to_del | from_del | viewed 
    1  4  2  0   1   0  
    1  2  4  1   0   0 <-- viewed should be 1 

同じクエリの中で:

UPDATE messages 
SET to_del=CASE WHEN to=2 THEN 1 ELSE to_del, viewed=1 END, <-- viewed=1 not working 
    from_del=CASE WHEN from=2 THEN 1 ELSE from_del END, 
WHERE company_id = '1' 

第1のCASE文が真である場合にのみ、どのように表示= 1にすることができますか?

答えて

2

ロジックが本当に簡単なのであれば、まっすぐな解決に向かない理由はありますか?

UPDATE messages 
SET to_del = if(to=2, 1, to_del), 
    viewed = if(to=2, viewed, 1), 
    from_del = if(from=2, 1, from_del) 
WHERE company_id = '1' 

か、あなたは本当に共通部分式(= 2へのビットやり過ぎ)を除去したい場合は

UPDATE messages 
SET to_del = if(@tmp:=to=2, 1, to_del), 
    viewed = if(@tmp, viewed, 1), 
    from_del = if(from=2, 1, from_del) 
WHERE company_id = '1' 
0

これを試してください。

UPDATE messages 
SET to_del=CASE WHEN to=2 THEN 1 ELSE to_del END, 
    viewed = CASE WHEN to = 2 THEN 0 ELSE 1 END, 
    from_del=CASE WHEN from=2 THEN 1 ELSE from_del END, 
WHERE company_id = '1' 
+0

私が見るための第三のケースを使用しないようにしようとしていました。 2つのケースで動作させることは可能ですか? – Maverick

関連する問題