压缩MySQL有序的组值

时间:2017-10-07 03:25:23

标签: mysql

此问题是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

2 个答案:

答案 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

DEMO

或者使用您想要的订单更新同一张表,您可以在查询

下使用
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

DEMO

  

注意确保在group and order列上添加索引以获得更好的性能。