MYSQL - 按组交换或重新排序2行或更多行的值

时间:2014-02-26 03:53:41

标签: mysql sql database

我有这张桌子:

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

有没有办法实现这个目标?

1 个答案:

答案 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的额外排序是保留原始订单。