2011-11-03 65 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

啊是的 - 也解決了這個問題。 –

相關問題