mysql – 在同一查询中访问先前更新的列的行为与JOIN /多表UPDATE的行为不同
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 在同一查询中访问先前更新的列的行为与JOIN /多表UPDATE的行为不同,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1794字,纯文字阅读大概需要3分钟。
内容图文
![mysql – 在同一查询中访问先前更新的列的行为与JOIN /多表UPDATE的行为不同](/upload/InfoBanner/zyjiaocheng/903/45f0746c71e14803a879dfcbfc4bf1b9.jpg)
假设我有两个表玩家和统计数据,其中包含以下内容:
mysql> select * from players;
+----+-------+
| id | alive |
+----+-------+
| 1 | 0 |
| 2 | 1 |
+----+-------+
mysql> select * from stats;
+--------+------+------+-------+
| player | win | lose | ratio |
+--------+------+------+-------+
| 1 | 12 | 20 | 0.6 |
| 2 | 8 | 1 | 8 |
+--------+------+------+-------+
而且我想增加每个玩家的胜利计数器,同时还要更新他们的赢/输比率.这看起来像这样:
update `stats` set `win` = `win` + 1, `ratio` = `win` / `lose`;
请注意,增加的win值用于计算比率(正如mysql的手册中所述:1.8.2.2 UPDATE Differences).
现在,当一个JOIN添加到UPDATE查询以限制它仅更新alive = 1的播放器时,此行为会更改:
update `stats` st
inner join `players` pl
on ( pl.`id` = st.`player` )
set `win` = `win` + 1, `ratio` = `win` / `lose`
where pl.`alive` = 1;
mysql> select * from stats;
+--------+------+------+-------+
| player | win | lose | ratio |
+--------+------+------+-------+
| 1 | 12 | 20 | 0.6 |
| 2 | 9 | 1 | 8 |
+--------+------+------+-------+
我发现的唯一解决方案是将win的新值分配给临时变量,并在计算比率时使用该值:
update `stats` st
inner join `players` pl
on ( pl.`id` = st.`player` )
set
`win` = @tmpWin := ( `win` + 1 ),
`ratio` = @tmpWin / `lose`
where pl.`alive` = 1;
为什么MySQL表现得那样,是否有更优雅的解决方案解决这类问题(除了创建一个视图来动态计算比率)?
表格创建如下:
create table `players` (
`id` INT,
`alive` TINYINT,
primary key (`id`)
);
create table `stats` (
`player` INT,
`win` INT,
`lose` INT,
`ratio` FLOAT,
primary key (`player`)
);
我正在使用MySQL v5.7.17
解决方法:
我无法解释连接案例的行为确实看起来很奇怪,但以下工作符合预期:
UPDATE `stats`
SET `win` = `win` + 1, `ratio` = `win` / `lose`
WHERE player IN (SELECT id FROM players WHERE alive=1);
内容总结
以上是互联网集市为您收集整理的mysql – 在同一查询中访问先前更新的列的行为与JOIN /多表UPDATE的行为不同全部内容,希望文章能够帮你解决mysql – 在同一查询中访问先前更新的列的行为与JOIN /多表UPDATE的行为不同所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。