mysql - 根据同一记录的其他字段中的值更新记录的字段
问题描述
我在一个表中有三列:
| 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
解决方案
我不认为你需要使用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
推荐阅读
- android-studio - 如何通过Android studio项目同步自定义编译参数?
- r - R组合具有相似值的行
- python - 尺寸必须相等,但对于输入形状为 [2,2,2,1], [1,1,2,1] 的“Conv2D”(操作:“Conv2D”)为 1 和 2
- javascript - 在新选项卡中从当前选项卡调用函数
- python - 在 Python 中循环遍历一组行
- java - JavaFX ActionEvent e 只激活一次
- c# - 发布到 AWS... Visual Studio 2017 中缺少
- javascript - Javascript-验证后防止页面重定向
- c++ - 当我们在 c 中使用 fopen() 搜索文件时实现了哪种搜索技术
- android - 在 recyclerView 中更新项目的最佳方法