我有这张桌子:
++++++++++++++++++++++++++++++++++++
+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)
您可以通过使用变量重置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
的额外排序是保留原始订单。