如何在 UPDATE 语句中使用用户定义的变量?

2024-01-04

我试图回答另一个所以问题 https://stackoverflow.com/questions/18404726并突然面临以下问题。分数应分配给得分最高的 3 个(mrk) 组 (grp)每个班级(sec)。得分最高的组得5分,排名第二的组得3分,排名第三的组只得1分。对于所有其他人pts应设置为null.

| ID | SEC | GRP | MRK |    PTS |
|----|-----|-----|-----|--------|
|  1 | cl2 |  ge |  32 | (null) |
|  2 | cl1 |  gb |  22 | (null) |
|  3 | cl1 |  gd |  22 | (null) |
|  4 | cl1 |  ge |  18 | (null) |
|  5 | cl2 |  ga |  26 | (null) |
|  6 | cl1 |  ga |  55 | (null) |
|  7 | cl2 |  gb |  66 | (null) |
|  8 | cl2 |  gc |  15 | (null) |
|  9 | cl1 |  gc |  12 | (null) |
| 10 | cl2 |  gf |   5 | (null) |
| 11 | cl2 |  ge |  66 | (null) |

我选择使用用户定义的变量,因为它们在分配方案方面提供了最大的灵活性,并很快提出了以下解决方案:

SELECT id,sec,grp,mrk,
CASE WHEN @s=sec THEN          -- whenever there is a new class ...
 CASE WHEN @m=mrk THEN @i ELSE -- issue the same points for 
                               -- identical scorers, otherwise ...
  CASE WHEN IF(@m:=mrk,@i,@i)>2 THEN @i:=@i-2  -- store mrk in @mrk and 
                               -- while @i>2 return points: 3 or 1 ...
                                ELSE @i:=null  -- no points for the rest
  END
 END
 ELSE NULLIF(@i:=5,(@s:=sec)=(@m:=mrk)) -- store sec in @s and mrk in @m
                                        -- and return points: 5
END pts
FROM tbl ORDER BY sec,mrk desc

的解释NULLIF(@i:=5,(@s:=sec)=(@m:=mrk)):

表达式@s:=sec and @m:=mrk都进行评估,然后将它们的值进行比较=。结果可以是0(假)或1(true) 但它肯定不等于5,另一个论点NULLIF函数,因此最终只有第一个参数(5)将被退回。我选择的构造是为了在不返回任何内容的情况下进行两个变量赋值。

好吧,也许不是最直接的解决方案;-),但我确实注意到了对于正在处理的每个记录,每个变量仅定义一次,因为“涉及用户变量的表达式的求值顺序未定义”mysql手册 http://dev.mysql.com/doc/refman/5.0/en/user-variables.html. The select确实给了我想要的

result:

| ID | SEC | GRP | MRK |    PTS |
|----|-----|-----|-----|--------|
|  6 | cl1 |  ga |  55 |      5 |
|  2 | cl1 |  gb |  22 |      3 |
|  3 | cl1 |  gd |  22 |      3 |
|  4 | cl1 |  ge |  18 |      1 |
|  9 | cl1 |  gc |  12 | (null) |
|  7 | cl2 |  gb |  66 |      5 |
| 11 | cl2 |  ge |  66 |      5 |
|  1 | cl2 |  ge |  32 |      3 |
|  5 | cl2 |  ga |  26 |      1 |
|  8 | cl2 |  gc |  15 | (null) |
| 10 | cl2 |  gf |   5 | (null) |

现在,我的问题是:

我该如何写一个UPDATE同样的语句将上面的计算结果存储在列中pts?

到目前为止我的尝试都失败了:

UPDATE tbl SET pts=
CASE WHEN @s=sec THEN
 CASE WHEN @m=mrk THEN @i ELSE
  CASE WHEN IF(@m:=mrk,@i,@i)>2 THEN @i:=@i-2 
                                ELSE @i:=null 
  END
 END
 ELSE NULLIF(@i:=5,(@s:=sec)=(@m:=mrk)) 
END
ORDER BY sec,mrk desc

result:

| ID | SEC | GRP | MRK | PTS |
|----|-----|-----|-----|-----|
|  6 | cl1 |  ga |  55 |   5 |
|  2 | cl1 |  gb |  22 |   5 |
|  3 | cl1 |  gd |  22 |   5 |
|  4 | cl1 |  ge |  18 |   5 |
|  9 | cl1 |  gc |  12 |   5 |
|  7 | cl2 |  gb |  66 |   5 |
| 11 | cl2 |  ge |  66 |   5 |
|  1 | cl2 |  ge |  32 |   5 |
|  5 | cl2 |  ga |  26 |   5 |
|  8 | cl2 |  gc |  15 |   5 |
| 10 | cl2 |  gf |   5 |   5 |

为什么更新语句只获得 pts 的单个值 (5)?!?

你可以在我的里面找到所有的数据和SQL语句SQL小提琴 http://sqlfiddle.com/#!2/b1461/6.


我尝试过调试这个案例。
我已经添加了 6 个新列tbl表:b_s、b_m、b_i 和 a_s、a_m、a_i
b_* - 表示“之前”,a_* - 表示“之后”,
我已将查询修改为:

UPDATE tbl SET 
   b_s = @s,
   b_m = @m,
   b_i = @i, 
pts=
CASE WHEN @s=sec THEN
 CASE WHEN @m=mrk THEN @i ELSE
  CASE WHEN IF(@m:=mrk,@i,@i)>2 THEN @i:=@i-2 
                                ELSE @i:=null 
  END
 END
 ELSE NULLIF(@i:=5,(@s:=sec)=(@m:=mrk)) 
END,
a_s = @s,
a_m = @m,
a_i = @i 
ORDER BY sec,mrk desc

我的目的是记录表达式求值前后的变量值。

这很奇怪 - 我不知道为什么,但似乎当你为所有变量赋值时在执行更新之前然后更新将按预期进行。
比较这两个演示:

1 - 错误:http://sqlfiddle.com/#!2/2db3e4/1 http://sqlfiddle.com/#!2/2db3e4/1
2 - 良好:http://sqlfiddle.com/#!2/37ff5/1 http://sqlfiddle.com/#!2/37ff5/1

唯一的区别是更新前的代码片段:

set @i='alamakota';
set @m='alamakota';
set @s='alamakota';

某种“魔力绳”:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 UPDATE 语句中使用用户定义的变量? 的相关文章

随机推荐

  • 异常 HRESULT: 0x800700C1 执行使用 boost 引用本机 c++ lib 的 C# 应用程序时

    我正在运行一个引用 C CLI 包装器项目的 C 应用程序 该项目又引用依赖于 Boost 1 47 库的本机 C 项目 链接到 vc100 mt gd 1 47 lib 形式的文件 所有库都是静态链接的 一切都编译得很好 执行 C 应用程
  • MySQL 连接字符串 C#

    我有这个错误 用户代码未处理 ObdcException 我不知道为什么这 这是连接字符串
  • 通过 *ngFor 在 Angular 2 模板中使用可观察量

    如果我使用 ngFor 构建访问链 我将无法访问异步管道提供的对象的属性 在下面的示例中 假设Parking在测试线和 filter propName 下面的两条线代表同一对象上的相同键 测试行的计算结果将为 true 但检查的属性不会 为
  • ZendDebugger 无法在 Mint 12 中打开 libssl.so.0.9.8

    我安装了 apache 和 php 现在使用 ZendDebugger 我并修改了 php ini 的描述方式 当我启动 apache 时 我在日志中收到以下错误消息 Failed loading usr lib php5 zend Zen
  • 优化重片段着色器的性能

    我需要帮助优化以下一组着色器 Vertex precision mediump float uniform vec2 rubyTextureSize attribute vec4 vPosition attribute vec2 a Tex
  • 在复制构造函数中调用赋值运算符

    这种复制构造函数的实现有一些缺点吗 Foo Foo const Foo i foo this i foo 我记得 在一些书中建议从赋值运算符调用复制构造函数并使用众所周知的交换技巧 但我不记得为什么 是的 这是一个坏主意 所有用户定义类型的
  • 如何使用搜索命令搜索点字符?

    我正在尝试使用 Vim 中的搜索命令 Rs F T X R range F text to find T text to replace with X options 但是 当我想搜索 时 点字符 我遇到一些问题 任务 替换所有出现的 空格
  • Perl 诅咒::UI

    我正在尝试使用 Curses UI 库http search cpan org dist Curses UI http search cpan org dist Curses UI 在 Linux karmic 上构建 UI 我可以创建一个
  • 检测 Windows Kit 8.0 和 Windows Kit 8.1 SDK

    我正在为 Windows 平板电脑 Windows Phone 和 Windows 应用商店应用程序编写测试脚本 这些脚本主要适用于 Visual Studio 2012 和 Windows Kit 8 0 SDK Microsoft 似乎
  • Jupyter 笔记本:本地存储的 pdf 文档的超链接在 Chrome 中停止工作

    我有大量的 Jupyter Notebook 其中许多都有指向本地存储的 pdf 文档的超链接 不久前 这些链接在我的 iMac 上的 Chrome 中停止工作 单击链接时 会打开一个带有正确地址的新选项卡 但页面只是黑色 当我在 MacB
  • Squeak/Pharo Web 服务的微框架

    许多语言都有用于编写非常小的网站或 Web 服务的微框架 例如用于 Python 的 Flask 或用于 Ruby 的 Sinatra 在 Squeak 上 似乎没有任何类似的东西 伊利亚特 海边 和 AIDA 都非常重 只是提供了一点服务
  • 如何在vb.net中使用打开文件对话框指定路径?

    在我的应用程序的第一次启动中 我需要指定一个路径来保存一些文件 但在打开文件对话框中 我似乎必须选择要打开的文件 如何只指定文件夹而不打开文件 比如 C config 这是我的代码 If apppath Then Dim fd As Ope
  • 如何使用 SQL 查询更新表中的多行?

    I am new to SQL and C 如屏幕截图所示 我想通过仅插入数量 描述和价格值来更新 订单详细信息 表中的 3 行 订单 3 DataGridView2 我使用 Order Number 和 DateTime 的组合来使订单详
  • Promise.all 与 Firebase DataSnapshot.forEach

    我有几个 HTML 选择 下拉菜单 它们是从名为 states 的 Firebase 节点填充的 见下图 选择城市后 将触发以下函数并检索该城市中发生的所有会议 有一个单独的 会议 节点 每个会议都有各种键 值对 例如街道 时间等 我 认为
  • 使用 jquery 添加新 css 规则的最佳方法?

    我在网页上动态插入一些 html 在检测到用户的事件后 这个 html 需要一些 css 样式 我想知道使用 jQuery 最简洁的方法是什么 我不是网站开发人员 所以我无法将这些规则添加到原始CSS中 假设我已经插入了一些没有样式的 ht
  • django-pagination 可以每页进行多个分页吗?

    如果不能 那么是否有任何其他替代方案 Django 的本机分页或备用包 允许每页多个分页 我想显示大约 5 个对象的列表 每个对象都有自己的分页上下文 为了方便起见 这里是django 分页文档 http pypi python org p
  • 使用消费计划的 Azure 功能的 VNET 集成

    我的 azure 函数正在消耗计划上运行 它需要访问在 Azure VNET 上的 VM 上运行的资源 该资源无法通过 http 公开 除了切换到应用服务计划之外还有其他解决方案吗 目前来看 这是不可能的 VNet 集成功能需要标准 高级或
  • Windows 窗体的每像素碰撞检测算法

    我正在寻找每像素碰撞检测算法 方法Windows 窗体 我已经搜索过了 但只找到了一个 XNA 如下所示 这样的算法不是很符合Windows Forms的概念吗
  • 客户端IP地址的最大长度[重复]

    这个问题在这里已经有答案了 可能的重复 IPv6 地址的文本表示的最大长度 https stackoverflow com questions 166132 maximum length of the textual representat
  • 如何在 UPDATE 语句中使用用户定义的变量?

    我试图回答另一个所以问题 https stackoverflow com questions 18404726并突然面临以下问题 分数应分配给得分最高的 3 个 mrk 组 grp 每个班级 sec 得分最高的组得5分 排名第二的组得3分