gpt4 book ai didi

mysql:一次性更新一列?

转载 作者:行者123 更新时间:2023-11-29 10:19:11 25 4
gpt4 key购买 nike

编辑:尝试在这里更具体......

我有下表:

SQL> describe dtab;
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| chance | int(10) unsigned | NO | | 0 | |
| base | int(10) unsigned | NO | | 0 | |
| data | varchar(20) | YES | | NULL | |
+--------+------------------+------+-----+---------+----------------+

我想知道是否有某种方法可以计算basen 的元素,使其等于 base 的总和+ chance n-1 行中的字段——全部包含一个 sql 语句。换句话说,从前几行如下所示的表开始:

| id | chance |  base | data    |
| 1 | 10 | 0 | value1 |
| 2 | 10 | 0 | value2 |
| 3 | 10000 | 0 | value3 |
| 4 | 1 | 0 | value4 |
| 5 | 1 | 0 | value5 |

...我们最终会得到如下所示的数据:

| id | chance |  base | data    |
| 1 | 10 | 0 | value1 |
| 2 | 10 | 10 | value2 |
| 3 | 10000 | 20 | value3 |
| 4 | 1 | 10020 | value4 |
| 5 | 1 | 10021 | value5 |

我尝试使用类似的方法通过使用计数器变量在整个表的行中按顺序设置值 set第一个,但我似乎无法理解这个。

假设:

  • 保证 ID 是连续的。
  • 给定行的 id 等于前一行的 id + 1,第一行除外,其 id 为 1 [请参阅表定义]。
  • 初始base所有行的值为 0 [请参阅表定义]。
  • base每次都会重新计算字段。

最佳答案

这是一个反复出现的问题(应该以其他方式解决;这通常是您的架构和建模存在问题的症状。理论上,您永远不应该依赖具有“自然顺序”的行,并且互相影响,如果删除其中一个会发生什么?)

您首先需要将表与其自身连接。作为一个条件,“要更新的表”的 ID 等于“要读取的表”加一

只有当 ID 是连续的时,这才有效,否则您需要更复杂的连接(仍然可能,只是更复杂)。

作为测试,我们创建一个这样的表

CREATE TABLE test12 ( id integer, base integer, chance integer );

并在其中输入一些值

INSERT INTO test12 VALUES ( 1, 10, 20 ), ( 2, 20, 17 ), ( 3, 5, 33 );

所以我们有:

mysql> select * from test12;
+------+------+--------+
| id | base | chance |
+------+------+--------+
| 1 | 10 | 20 |
| 2 | 20 | 17 |
| 3 | 5 | 33 |
+------+------+--------+
3 rows in set (0.00 sec)

您想要的更新是 JOIN 上的 SET。请注意我们如何需要两个不同的别名(a 和 b)来允许 MySQL 识别我们想要完成的操作:

UPDATE test12 AS a JOIN test12 AS b ON (a.id = b.id + 1) 
SET a.base = b.base + b.chance;

表格现在是:

+------+------+--------+
| id | base | chance |
+------+------+--------+
| 1 | 10 | 20 |
| 2 | 30 | 17 |
| 3 | 37 | 33 |
+------+------+--------+

肮脏的黑客(修改后的问题)

您可以使用正确的基值创建临时表

SELECT id, base, chance FROM ( SELECT id, @prev AS base, chance, @prev := @prev + chance AS upd FROM test12, (SELECT @prev := 0) AS init ORDER BY id ) AS tmp;

...然后您可以通过将其与临时值连接来更新 test12

关于mysql:一次性更新一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49639753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com