2017-05-07 21 views
0

這是我的表的樣子:如何在MySQL中移動列的值?

表名:繼

+----+-------+-------+-------+-------+ 
| ID | user1 | user2 | user3 | user4 | 
+----+-------+-------+-------+-------+ 
| 1 | user2 | user1 | user2 | user2 | 
| 2 | user3 | user3 | user1 | user3 | 
| 3 | user4 | user4 | user4 | user1 | 
+----+-------+-------+-------+-------+ 

但就像如果變化的值:

+----+-------+-------+-------+-------+ 
| ID | user1 | user2 | user3 | user4 | 
+----+-------+-------+-------+-------+ 
| 1 | user2 | user1 | user2 | user2 | 
| 2 | user3 | user3 | null | user3 | 
| 3 | user4 | user4 | user4 | user1 | 
+----+-------+-------+-------+-------+ 

如何讓我的價值user4(以下其他值那)在沒有NULL值之間? 我想要的輸出:

+----+-------+-------+-------+-------+ 
| ID | user1 | user2 | user3 | user4 | 
+----+-------+-------+-------+-------+ 
| 1 | user2 | user1 | user2 | user2 | 
| 2 | user3 | user3 | user4 | user3 | 
| 3 | user4 | user4 | null | user1 | 
+----+-------+-------+-------+-------+ 

我厭倦了這樣的查詢:

UPDATE following t1 
LEFT OUTER JOIN following t2 ON T1.user3+1=T2.user3 - 2 
SET t1.user3 = t2.user3; 

,但我得到了一些錯誤Error code 1,292, SQLState 22007] Truncated incorrect DOUBLE value: user2

+0

爲什麼你需要做這樣的事情?如果這個值可以像這樣任意移動,那麼這個值和給定行之間的關係是什麼......這意味着你的設計沒有被標準化,至少可以說。你需要重新思考這個問題。 – GurV

+0

@GurwinderSingh這些值主要依賴列名而不是行。我無法解釋這是如何工作的,但對於我正在做的事情來說,這很有效。 –

回答

0

我不知道如何查詢寫在mysql,但這是一種可以實現的方式。

拳:

You show get the Min(ID) and Max(ID). 

二:

Write a loop For i = Min(ID) to Max(ID)

三:

Update Following set user3 = (Select user3 from Following where ID = i+1) where ID = i 

四:

Set the last one row data to null or something else what you want init. 
0

您需要與現有的非null名稱

SQL DEMO

UPDATE Table1 
LEFT JOIN (SELECT `ID`, 
        `user3`, 
        @rn := @rn + 1 as rn 
      FROM Table1 
      CROSS JOIN (SELECT @rn := 0) as vars 
      WHERE `user3` IS NOT NULL 
      ORDER BY `ID`) news 
    ON Table1.`ID` = news.rn 
SET Table1.`user3` = news.`user3`; 

輸出

enter image description here

注意創建一個有序列表:在這裏,我假設ID是連續序列。如果不是這種情況,您需要創建一個臨時ID列來進行連接。