如何在 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 语句中使用用户定义的变量? 的相关文章

  • MySQL 8 用逗号分割字符串并将其转换为JSON ARRAY

    我有以下字符串 a b c d 我想将它转换成一个 json 数组 像这样 a b c d MySQL 8 有什么函数可以实现这个功能吗 Try SELECT CAST CONCAT REPLACE a b c d AS JSON See
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • PHP PDO 使用 bindParam 第一个参数(不带冒号)[重复]

    这个问题在这里已经有答案了 请检查这个 user id int GET user id sql DELETE FROM users WHERE user id user id query db gt prepare sql query gt
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • MySQL 错误 1172 - 结果包含多行

    在存储过程中运行查询时 我从 MySQL 收到此错误 错误代码 1172 结果包含多行 我理解错误 我正在做一个SELECT INTO var list 因此查询需要返回单行 当我使用LIMIT 1 or SELECT DISTINCT 错
  • MySQL 排序顺序 - 排序规则?

    我在对 MySQL 中的 char 字段进行排序时遇到困难 问题是重音字符与非重音字符混淆 例如 Abc bd Acc 我认为这可能与整理有关 所以我将表格的排序规则更改为utf8 ut8 bin 看完之后这个帖子 https stacko
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • 将庞大数据库从亚马逊RDS导出到本地mysql

    我在 Amazon RDS 上有一个 mysql 数据库 大约 600GB 数据 我需要将其移回本地专用服务器 但我不知道从哪里开始 每次我尝试初始化 sqldump 时它都会冻结 有没有办法将其移至 S3 甚至可能在开始下载之前将其分成更
  • 如何检测Mysql/innodb中的死锁?

    我知道在 Innodb 中使用事务时不可避免地会发生死锁 并且如果应用程序代码正确处理死锁 它们是无害的 正如手册所说 只需再试一次 所以我想知道 如何检测死锁 死锁是否会发出一些特殊的 mysql 错误号 如果重要的话 我正在使用 PHP
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 随机组合 MySQL 数据库中的两个单词

    我有一个包含名词和形容词的数据库 例如 id type word 1 noun apple 2 noun ball 3 adj clammy 4 noun keyboard 5 adj bloody ect 我想创建一个查询 它将抓取 10
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 从前端更改记录顺序

    我在编写下一个功能时遇到问题 我希望用户能够重新排列记录并更改 display order 值 我使用 Jquery UI 的可拖放功能来促进这一点 我可以看到如何简单地交换 display order 值 但我想为一条记录设置一个显示顺序
  • MySQL 与 PostgreSQL JSON 搜索功能

    我一直在寻找一篇博客文章或一个功能矩阵 通过 JSON 功能对 MySQL 和 PostgreSQL 进行比较 我找到了一个好的Postgres 的特征矩阵 https www postgresql org about featuremat
  • 如何在 MySQL 查询本身中检索 JSON 数组中存储的值?

    我有下表 product id product name image path misc 1 flex http firstpl course level id 19 group id 40067 2 Android http firstp
  • 加载“mysql2”Active Record 适配器时出错

    我正在尝试升级我的应用程序 这是我在部署应用程序时遇到的错误 加载 mysql2 Active Record 适配器时出错 缺少它所依赖的宝石 无法激活mysql2 0 4 4 已经激活mysql2 0 3 21 确保所有依赖项都添加到 G
  • 如何从MySQL数据库获取今天/昨天的数据?

    我想从数据库中检索今天的数据 但我不知道该怎么做 我实际上想要获取不是过去 24 小时的数据 我只想获取今天的数据 因此基于实际服务器时间 我还想获取昨天的数据 谁能帮我怎么做 示例代码 SELECT id FROM folk WHERE
  • 如何将自托管 WordPress 和已安装的实时站点插件升级到最新可用版本而不遇到任何麻烦?

    我必须升级正在运行的 WordPress 网站的 WordPress CMS 和一些已安装的插件 并且我想要升级的一些插件之前已被修改以实现某些目标 http easycaptures com fs uploaded 288 9522279
  • 使用 order by 和 limit 从多个表中删除

    我试图从使用 ORDER BY DESC 和 LIMIT 有关系的两个表中删除 DELETE FROM my rel table AS t1 LEFT JOIN my photo table AS t2 ON t2 typeid t1 ty
  • 在查询中创建临时变量

    我希望能够在查询中创建一个临时变量 而不是存储过程或函数 它不需要声明和设置 这样我在调用它时就不需要传递查询参数 正在努力朝这个方向努力 Select field1 tempvariable 2 2 newlycreatedfield t

随机推荐

  • 异常 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分