根据同一记录的其他字段中的值更新记录的字段

时间:2018-11-07 14:52:43

标签: mysql

我在表中有三列:

| PLANNING | ASSESSMENTANDDATA |TOTAL
| One Word | One Test          | 
| Two Word | Two Test          | 

我需要为每条记录更新“ TOTAL”列,以便如果“ PLANNING”列中包含“ One”,则将该行的运行总计加1。然后,如果“ ASSESSMENTANDDATA”包含“ 1”,则在该行的运行总计中添加另一个1,然后用2更新“ TOTAL”。下一个记录将是-如果“ PLANNING”列包含“ 2”,则将2添加到运行中总行数。然后,如果“ ASSESSMENTANDDATA”包含“ Two”,则在该行的运行总计中再添加2,然后将“ TOTAL”更新为4。

| PLANNING | ASSESSMENTANDDATA |TOTAL
| One Word | One Test          | 2
| Two Word | Two Test          | 4

到目前为止,我的情况是:(正在进行中-我认为还远远没有完成)

SET @runtot := 0;
SELECT 
id,
SUM(CASE 
        WHEN PLANNING like '%One%' THEN @runtot := @runtot + 1
        WHEN PLANNING like '%Two%' THEN @runtot := @runtot + 2
        WHEN ASSESSMENTANDDATA like '%One%' THEN @runtot := @runtot + 1
        WHEN ASSESSMENTANDDATA like '%Two%' THEN @runtot := @runtot + 2
    END)
        FROM RUBERIC
GROUP BY id

1 个答案:

答案 0 :(得分:0)

我认为您不需要将Group BySum()聚合一起使用。如果我们使用Case .. When表达式,那么它将是嵌套表达式。

但是,我们可以利用MySQL的隐式转换和类型转换行为,例如LIKE %..%运算符的返回值可以视为0/1。我们可以使用它来添加,而不用编写多个Case .. When表达式。

请尝试以下操作:

SELECT 
  id, 
  PLANNING, 
  ASSESSMENTANDDATA, 
  (@runtot := @runtot + 
             (1 * ((PLANNING like '%One%') + (ASSESSMENTANDDATA like '%One%'))) + 
             (2 * ((PLANNING like '%Two%') + (ASSESSMENTANDDATA like '%Two%')))
  ) AS TOTAL 
FROM RUBERIC
CROSS JOIN (SELECT @runtot := 0) AS user_init_vars