【问题标题】:MYSQL: UPDATE MULTIPLE COLUMNS BASED ON IFMYSQL:根据 IF 更新多列
【发布时间】:2023-03-13 00:55:02
【问题描述】:

早上好,我告诉他们我的情况: 我有两张桌子:

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)

表格“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

但是没用

即根据“RATINGS”表中输入的“GUIDE”更新表“RATINGS_PERGUIDE”中的对应列(24个“GUIDES”不同)

同样,如果可以在触发器中为插入“RATINGS”表的每条新记录执行此操作会好得多

请帮忙

【问题讨论】:

    标签: mysql if-statement sql-update multiple-columns


    【解决方案1】:

    您正试图在update 中进行转点,这有点复杂。一种方法是简单地进行多次更新:

    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;
    

    为每个指南修改并重复此更新。

    如果您真的想在单个查询中执行此操作:

    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,
            . . .
    

    【讨论】:

    • 谢谢,我让它在触发器上运行的第一个示例一次新插入执行了您的第二个提案的测试。这两种情况下的问题是“指南”的数量(总共 24 个),这将是一个相当大的查询谢谢
    • @Liko28 。 . .如果您在触发器中执行此操作,您应该有一个where 子句,该子句严格限制行数,大概是一个用户。任何一个查询都应该没问题。
    【解决方案2】:

    我通过简单地观察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
    

    这对我有用,我把它放在一个存储过程中,然后用触发器调用

    感谢所有人和Gordon Linoff

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      相关资源
      最近更新 更多