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

时间:2011-11-03 10:56:30

标签: mysql sql

在此表中,有一个名为“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子句'中为update更新指定目标表'message'。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

编辑 - 更新后,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);

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

考虑两行:

在换行之前

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