在此表中,有一个名为“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'。
我该如何解决这个问题?
答案 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