我想以相当复杂的方式更新一个表,并且决定将内表连接到它自己的表是有用的。 (为了给出一些背景,表格存储通过chain_id字段链接的记录的短链,并且在链中通过日期字段进行排序。更新需要处理具有与日期不同的最近日期的符号。其他人在其链中,也可能需要将一些链分成多个单独的链)。在MySQL中更新一个表内连接本身
这是我所看到的一个简化版本:
CREATE TABLE t(
`a` INT(3) NOT NULL,
`b` INT(3)
);
INSERT INTO t VALUES (3,4),(3,6);
SELECT * FROM t;
------------
| a | b |
-------------
| 3 | 4 |
| 3 | 6 | as expected
UPDATE t t1
INNER JOIN t t2
ON (t1.a = t2.a
AND t1.b > t2.b)
SET t1.b = t1.a
AND t2.b = t1.a;
SELECT * FROM t;
------------
| a | b |
-------------
| 3 | 4 |
| 3 | 0 | wat
我本来希望得到是:
------------
| a | b |
-------------
| 3 | 3 |
| 3 | 3 |
所以很明显,这是个不错的计划,但让我有三个问题:
1.)这里发生了什么事?
2.)由于无论发生什么事情都不太可能是预期的,MySQL为什么会允许它?
3)是否有另一种方式来实现类似我的本意(即实际更新的表内加入了与自身,不只是把一切都设置为3 ...)
更新与本身的内部连接的表是(在我看来)一个非常糟糕的主意。你很可能有深度未知的层次结构,因此最好的方法是(假设MySQL不支持递归查询)实现一个简单的递归函数,在每个**链**中找到合适的值,并且在递归完全倒回时,更新拨款记录。 – FDavidov