2014-02-26 17 views
-1

重排的2個或更多行中的值我有這個表:MYSQL - 交換或

++++++++++++++++++++++++++++++++++++ 
+order_no + item_name + group_no + 
++++++++++++++++++++++++++++++++++++ 
+ 1  + item1  +  0  + 
+ 2  + item2  +  1  + 
+ 3  + item3  +  1  + 
+ 4  + item4  +  1  + 
+ 5  + item5  +  2  + 
+ 6  + item6  +  2  + 
+ 7  + item7  +  3  + 
+ 8  + item8  +  3  + 
+ 9  + item9  +  0  + 
+ 10 + item10 +  4  + 
+ 11 + item11 +  4  + 
+ 12 + item12 +  4  + 
+ 13 + item13 +  4  + 
+ 14 + item14 +  5  + 
+ 15 + item15 +  0  + 
++++++++++++++++++++++++++++++++++++ 

注: order_no不AUTO_INCREMENT。

我想根據group_no交換order_no。例如,如果我交換了group1和group4的order_no,這將成爲新表。

++++++++++++++++++++++++++++++++++++ 
+order_no + item_name + group_no + 
++++++++++++++++++++++++++++++++++++ 
+ 1  + item1  +  0  + 
+ 11 + item2  +  1  + 
+ 12 + item3  +  1  + 
+ 13 + item4  +  1  + 
+ 6  + item5  +  2  + 
+ 7  + item6  +  2  + 
+ 8  + item7  +  3  + 
+ 9  + item8  +  3  + 
+ 10 + item9  +  0  + 
+ 2  + item10 +  4  + 
+ 3  + item11 +  4  + 
+ 4  + item12 +  4  + 
+ 5  + item13 +  4  + 
+ 14 + item14 +  5  + 
+ 15 + item15 +  0  + 
++++++++++++++++++++++++++++++++++++ 

有沒有辦法做到這一點?

+0

爲什麼組「0」展開,而不是像其他組一樣在相鄰的行上展開? –

+0

如果group_no爲0,則表示它沒有組。 –

回答

0

您可以通過使用變量重置order_no來實現此目的。這個想法是重新排序表,並只分配連續的數字。

update table t cross join 
      (select min(case when group_no = 1 then order_no end) as on1, 
        min(case when group_no = 4 then order_no end) as on4, 
        @ordernum := 0 
       from t 
      ) vals  
    set order_no = (@ordernum := @ordernum + 1) 
    order by (case when group_no = 1 then on4 
        when group_no = 4 then on1 
        else order_no 
       end), 
      order_no; 

order by的第一部分交換組。 order_no的附加排序是保持原來的順序。