简体   繁体   English

MYSQL:基于IF更新多个列

[英]MYSQL: UPDATE MULTIPLE COLUMNS BASED ON IF

Good morning, I tell them my situation: I have two tables: 早上好,我告诉他们我的情况:我有两个桌子:

RATINGS:
GUIDE   varchar(7)
USER    varchar(20)
PRETEST decimal(4,3)
POSTEST decimal(4,3)

RATINGS_PERGUIDE:
USER    varchar(20)
GUIDE1_PRETEST  decimal(4,3)
GUIDE1_POSTEST  decimal(4,3)
GUIDE2_PRETEST  decimal(4,3)
GUIDE2_POSTEST  decimal(4,3)3
.
.
.
GUIDE20_PRETEST decimal(4,3)
GUIDE20_POSTEST decimal(4,3)

Table "RATINGS" has a form for entering the information, I need to move the information entered to the table "RATINGS_PERGUIDE", i try this: 表“ RATINGS”具有用于输入信息的表格,我需要将输入的信息移至表“ RATINGS_PERGUIDE”,我尝试这样做:

UPDATE RATINGS , RATINGS_PERGUIDE
IF RATINGS.USER = RATINGS_PERGUIDE.USER AND RATINGS.GUIDE = 'GUIDE 1'
THEN 
SET RATINGS_PERGUIDE.GUIDE1_PRETEST = RATINGS.PRETEST
SET RATINGS_PERGUIDE.GUIDE1_POSTEST = RATINGS.POSTEST
ELSE IF RATINGS.USER = RATINGS_PERGUIDE.USER AND RATINGS.GUIDE = 'GUIDE 2'
THEN 
SET RATINGS_PERGUIDE.GUIDE2_PRETEST = RATINGS.PRETEST;
SET RATINGS_PERGUIDE.GUIDE2_POSTEST = RATINGS.POSTEST;
.
.
.
END IF

But doesn't work 但是不起作用

ie, according to the "GUIDE" entered in the table "RATINGS" update the corresponding column in the table "RATINGS_PERGUIDE" (24 "GUIDES" different) 即,根据表“ RATINGS”中输入的“ GUIDE”更新表“ RATINGS_PERGUIDE”中的相应列(24个“ GUIDES”不同)

Likewise, if it can be done in a trigger for each new record inserted into the table "RATINGS" would be much better 同样,如果可以在触发器中为插入到表“ RATINGS”中的每条新记录做得更好

Please Help 请帮忙

You are trying to do a pivot in an update and that is a little complicated. 您正在尝试做一个update的枢纽,这有点复杂。 One way is to simply do multiple updates: 一种方法是简单地进行多次更新:

update RATINGS_PERGUIDE join
       RATINGS
       on RATINGS.USER = RATINGS_PERGUIDE.USER and
          RATINGS.GUIDE = 'GUIDE 1'
    SET RATINGS_PERGUIDE.GUIDE1_PRETEST = RATINGS.PRETEST,
        RATINGS_PERGUIDE.GUIDE1_POSTEST = RATINGS.POSTEST;

Modify and repeat this update for each of the guides. 为每个指南修改并重复此更新。

If you really want to do this in a single query: 如果您真的想在单个查询中执行此操作:

update RATINGS_PERGUIDE join
       (select r.user,
               max(case when r.GUIDE = 'GUIDE 1' then pretest end) as pretest_guide1,
               max(case when r.GUIDE = 'GUIDE 1' then posttest end) as posttest_guide1,
               max(case when r.GUIDE = 'GUIDE 2' then pretest end) as pretest_guide2,
               max(case when r.GUIDE = 'GUIDE 2' then posttest end) as posttest_guide2,
               . . .
        from RATINGS r
        group by r.user
       ) r
       on r.USER = RATINGS_PERGUIDE.USER
    SET RATINGS_PERGUIDE.GUIDE1_PRETEST = r.pretest_guide1,
        RATINGS_PERGUIDE.GUIDE1_POSTEST = r.posttest_guide1,
        RATINGS_PERGUIDE.GUIDE2_PRETEST = r.pretest_guide2,
        RATINGS_PERGUIDE.GUIDE2_POSTEST = r.posttest_guide2,
        . . .

I have found the solution by simply observing the structure of "Update" in Phpmyadmin 我已经通过简单地观察Phpmyadmin中“更新”的结构找到了解决方案

UPDATE RATINGS , RATINGS_PERGUIDE
SET RATINGS_PERGUIDE.GUIDE1_PRETEST = (CASE WHEN RATINGS.GUIDE = 'GUIDE 1' THEN RATINGS.PRETEST ELSE RATINGS_PERGUIDE.GUIDE1_PRETEST END),
RATINGS_PERGUIDE.GUIDE1_POSTEST = (CASE WHEN RATINGS.GUIDE = 'GUIDE 1' THEN RATINGS.PRETEST ELSE RATINGS_PERGUIDE.GUIDE1_POSTEST END),
RATINGS_PERGUIDE.GUIDE2_PRETEST = (CASE WHEN RATINGS.GUIDE = 'GUIDE 2' THEN RATINGS.PRETEST ELSE RATINGS_PERGUIDE.GUIDE2_PRETEST END),
RATINGS_PERGUIDE.GUIDE2_POSTEST = (CASE WHEN RATINGS.GUIDE = 'GUIDE 2' THEN RATINGS.PRETEST ELSE RATINGS_PERGUIDE.GUIDE2_POSTEST END),
. . . .
WHERE RATINGS.USER = RATINGS_PERGUIDE.USER

And this work for me, I put it in a stored procedure and then call with a trigger 对我来说,这是一项工作,我将其放入存储过程中,然后使用触发器进行调用

Thanks to All and to Gordon Linoff 感谢所有人和Gordon Linoff

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM