此问题是mysql compress order_by values的扩展名。
我的桌子上有一组有序的数字,有不良的间隙。如何在保持原始顺序的同时对每个组重新编号?
Group Order Desired Order
A 1 1
A 3 2
A 6 3
A 7 4
B 2 1
B 3 2
B 8 3
C 1 1
C 7 2
C 8 3
答案 0 :(得分:0)
您可以创建一个变量来存储group
的上一个值,并为desiredorder
创建另一个值。基本上这是MySql不支持的Window函数ROW_NUMBER的模仿。
我将列重命名为group=col1, order=col2
select col1,
col2,
neworder
from (
select t.col1,
t.col2,
case when @prev=t.col1 then @id:=@id+1 else @id:=1 end as neworder,
@prev:=t.col1
from (select @prev:=null, @id:=0) a,
toorder t
order by t.col1
) a
在此处查看:http://sqlfiddle.com/#!9/9d8528/2
只有在您只想拉出这三列时才需要外部查询。
答案 1 :(得分:0)
您还可以使用相关子查询而不使用和变量
来获得所需的顺序select t1.*,
(
select count(*)
from demo t2
where t1.`group` = t2.`group`
and t1.`order` > t2.`order`
) + 1 desiredorder
from demo t1
或者使用您想要的订单更新同一张表,您可以在查询
下使用update demo a
join (select t1.*,(
select count(*)
from demo t2
where t1.`group` = t2.`group`
and t1.`order` > t2.`order`
) + 1 desiredorder
from demo t1
) b on a.`group` = b.`group`
and a.`order` = b.`order`
set a.`order` = b.desiredorder
注意确保在group and order列上添加索引以获得更好的性能。