2015-02-07 63 views
2

我有一個表id, name, position, old_position列。Mysql - 根據訂單從另一列更新表列

old_position包含唯一的數字,用於定義選擇時的順序。但是這些數字並不連續(即使訂購時也是如此)。例如。 2,12,11,14,20,35,45,28,

我試圖實現是填充有從1開始的連續號的列position,但具有相同的順序根據old_position,所以當我通過position ASC訂購後,我仍然可以得到相同的行次序。有沒有辦法做到這一點 ?

感謝

+0

如果您正在使用這些值進行排序,您爲什麼關心它們是否連續? – 2015-02-07 16:28:33

+0

@GordonLinoff實際上情況有點複雜和本地化,只是想保持簡單的問題。但我確定這是我需要的。謝謝 – dav 2015-02-07 16:33:52

回答

2

假設id爲每個行唯一的,你可以通過使用變量做到這一點:

update <table> t join 
     (select t.id, @rn := @rn + 1 as seqnum 
     from <table> t cross join (select @rn := 0) vars 
     order by old_position 
     ) tt 
     on tt.id = t.id 
    set t.position = tt.seqnum; 

如果你願意,你可以寫這個沒有子查詢。挑戰在於定義變量。這裏有一個方法:

update <table> t 
    set t.position = (@rn := coalesce(@rn, 0) + 1) 
    order by old_position; 

您不能在一個子查詢初始化變量,因爲MySQL沒有允許這兩種joinorder byupdate聲明。

+0

酷!它的工作,非常好。順便說一句,'更新表t'應該''更新噸',嘗試時出現錯誤。謝謝你 – dav 2015-02-07 16:36:39

+0

@dav。 。 。當問題沒有提供時,我只是使用「表格」作爲通用表格名稱。這似乎是一個壞習慣。 – 2015-02-07 16:37:26

+0

哦,明白了))我的壞。謝謝您的幫助 – dav 2015-02-07 16:46:53