web-dev-qa-db-ja.com

MySQL - 1回のクエリで、異なる値で複数の行を更新

私は異なる値で複数の行を更新する方法を理解しようとしています、そして私はそれを得ません。解決策はいたるところにありますが、私には理解するのが難しいようです。

たとえば、3つのクエリが1つのクエリに更新されます。

UPDATE table_users
SET cod_user = '622057'
    , date = '12082014'
WHERE user_rol = 'student'
    AND cod_office = '17389551'; 

UPDATE table_users
SET cod_user = '2913659'
    , date = '12082014'
WHERE user_rol = 'assistant'
    AND cod_office = '17389551'; 

UPDATE table_users
SET cod_user = '6160230'
    , date = '12082014'
WHERE user_rol = 'admin'
    AND cod_office = '17389551'; 

私は 例を読みました 、しかし私は実際にどのように問い合わせをするのかわかりません。すなわち:

UPDATE table_to_update
SET cod_user= IF(cod_office = '17389551','622057','2913659','6160230')
    ,date = IF(cod_office = '17389551','12082014')
WHERE ?? IN (??) ;

WHERE条件とIF条件に複数の条件がある場合にクエリを実行する方法が完全にはわかりません。

102
franvergara66

あなたはそれをこうすることができます:

UPDATE table_users
    SET cod_user = (case when user_role = 'student' then '622057'
                         when user_role = 'assistant' then '2913659'
                         when user_role = 'admin' then '6160230'
                    end),
        date = '12082014'
    WHERE user_role in ('student', 'assistant', 'admin') AND
          cod_office = '17389551';

あなたの日付フォーマットがわかりません。日付は、ネイティブの日付と時刻の種類を使用してデータベースに格納する必要があります。

145
Gordon Linoff

MySQLでは、複数の更新を1つのクエリにまとめるためのより読みやすい方法が許可されています。これはあなたが説明したシナリオによりよく適合しているように見え、ずっと読みやすく、そしてこれらの解くのが困難な複数の条件を避けます。

INSERT INTO table_users (cod_user, date, user_rol, cod_office)
VALUES
('622057', '12082014', 'student', '17389551'),
('2913659', '12082014', 'assistant','17389551'),
('6160230', '12082014', 'admin', '17389551')
ON DUPLICATE KEY UPDATE
 cod_user=VALUES(cod_user), date=VALUES(date)

これはuser_rol, cod_officeの組み合わせが主キーであると仮定しています。これらのうちの1つだけがPKである場合は、もう1つのフィールドをUPDATEリストに追加してください。どちらも主キーではない場合(これはありそうもないことですが)、この方法では常に新しいレコードが作成されます - おそらく必要なものではありません。

ただし、この方法では、準備済みステートメントを簡単に作成でき、より簡潔にできます。

78
Trevedhek

CASEステートメントを使用して、複数のif/thenシナリオを処理できます。

UPDATE table_to_update 
SET  cod_user= CASE WHEN user_rol = 'student' THEN '622057'
                   WHEN user_rol = 'assistant' THEN '2913659'
                   WHEN user_rol = 'admin' THEN '6160230'
               END
    ,date = '12082014'
WHERE user_rol IN ('student','assistant','admin')
  AND cod_office = '17389551';
11
Hart CO
update table_name
set cod_user = 
    CASE 
    WHEN user_rol = 'student' THEN '622057'
    WHEN user_rol = 'assistant' THEN '2913659'
    WHEN user_rol = 'admin' THEN '6160230'?
    END,date = '12082014'

WHERE user_rol IN ('student','assistant','admin')
AND cod_office = '17389551';
6
Akshay Bhan