2011-11-03 66 views
0

在这个表中,有一个名为'position'的列。 (第一行有位置0,第二行有1等)如何在MySQL更新语句中选择同一个表

现在,如果位置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错误(1093):可以'指定目标表'消息'在FROM子句中更新'。

我该如何解决这个问题?

+0

“它在MySQL上不起作用”是什么意思?任何错误信息,或只是没有做你期望的?请详细说明一些示例数据 – Yahia

+0

我已经添加了错误消息。 – Ivar

+0

这是一个已知的问题...尝试我的答案下面(不知道它的工作原理虽然) – Yahia

回答

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); 
+0

SQL错误(1248):每个派生表都必须有自己的别名 当我尝试'(SELECT * FROM message)AS x'时,它会运行,但它不会影响任何。 – Ivar

+0

@Ivar请尝试新的更新.. – Yahia

+0

@Yahia两次包装不会帮助。 – Ariel

0

ORDER BY position DESC添加到查询中,从下往上做,并避免同一时间两次具有相同的位置。

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

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

+0

@Yahia我发布之前,OP发布了错误是。我更新了我的答案。 – Ariel

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 
+0

根据OP刚刚发布的错误MySQL不支持此... – Yahia

+0

感谢您的尝试,但它仍然给我同样的错误:'SQL错误(1093):您无法指定目标表'消息'进行更新在FROM子句中“。 – Ivar

+0

啊是的 - 也解决了这个问题。 –

相关问题