首页 > 解决方案 > 根据同一记录的其他字段中的值更新记录的字段

问题描述

我在一个表中有三列:

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

我需要更新每条记录的“TOTAL”列,以便如果“PLANNING”列包含“One”,则将该行的运行总计加 1。然后,如果“ASSESSMENTANDDATA”包含“One”,则在该行的运行总计中再添加 1,然后将“TOTAL”更新为 2。下一条记录将是 - 如果“PLANNING”列包含“Two”,则在运行中添加 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

标签: mysql

解决方案


我不认为你需要使用Group By聚合Sum()。如果我们要使用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 

推荐阅读