繁体   English   中英

如何在MySQL的update语句中选择相同的表

[英]How to select same table in update statement with MySQL

在此表中,有一个名为“position”的列。 此列从0开始向上计数。(第一行有0位,第二行有1等)

现在,如果位置4的行向上移动,我想将上面的行(位置3的行)设置为当前位置。 (因此位置3变为位置4)

例如:

我有:

id = 12, position = 2
id = 11, position = 3
id = 9, position = 4
id = 8, position = 5

更新后,我想:

id = 12, position = 2
id = 11, position = 4
id = 9, position = 3
id = 8, position = 5

我想使用行的id来更新位置。

这就是我所拥有的,但它不适用于MySQL:

UPDATE message
SET position = position + 1
WHERE position = (SELECT position - 1 FROM message WHERE id = 11);

当我尝试运行它时,它给了我这个错误:'SQL Error(1093):你不能在FROM子句中为更新指定目标表'message'。

我怎样才能解决这个问题?

编辑 - UPDATE后来自OP的样本数据:

我假设您知道ID(= 11)并希望数据如您更新的问题所示更改...您需要更新2行才能实现:

UPDATE message m SET
m.position = (CASE WHEN m.id = 11 THEN m.position + 1 ELSE m.position - 1 END)
WHERE m.id = 11 OR m.id =
(SELECT z.li FROM (SELECT MAX (l.id) li FROM message h INNER JOIN message l ON h.position = (l.position - 1) WHERE h.id = 11) z);

ORDER BY position DESC添加到查询中以从下到上执行此操作,并避免同时两次使用相同的位置。

编辑:我在OP之前发布了这个说他的错误是什么 - 我猜对了。

到目前为止,这里最简单的解决方案是获取父代码中的位置,而不是在MySQL中执行。

认为我们需要遵循这一点(我想我已经理解了这个想法,但如果没有,请纠正我):

考虑两行:

换行前

ID=10, Position=3
ID=11, Position=4

我们移动ID = 11:

ID=10, Position=3
ID=11, Position=3

我们需要

ID=10, Position=4
ID=11, Position=3

因此更新应该是:

UPDATE message
SET position = position + 1
WHERE position = (SELECT position FROM (select id, position from message) WHERE id = 11)
    and id<>11

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM