交错MySQL表行

时间:2014-09-03 15:00:48

标签: mysql sql

我有一个包含数据和类的表,比如

----------------
| DATA | Class |
----------------
|  1   |   A   |
|  2   |   A   |
|  5   |   B   |
|  10  |   A   |
|  2   |   A   |
|  45  |   B   |
|  90  |   B   |
----------------

我想交换两个类来获得这样的东西:

----------------
| DATA | Class |
----------------
|  1   |   A   |
|  5   |   B   |
|  2   |   A   |
|  45  |   B   |
|  2   |   A   |
|  90  |   B   |
|  10  |   A   |
----------------

我考虑过动态生成一个额外的列,它将为每个单独的类添加一个顺序递增索引并对该类进行排序,但需要一个好的方向/指针来执行此操作。

类似的东西:

-----------------------
| DATA | Class | indx |
-----------------------
|  1   |   A   |  1   |
|  5   |   B   |  1   |
|  2   |   A   |  2   |
|  45  |   B   |  2   |
|  2   |   A   |  3   |
|  90  |   B   |  3   |
|  10  |   A   |  4   |
-----------------------

甚至可以只使用MySQL吗?

2 个答案:

答案 0 :(得分:4)

独立枚举每个类,然后按枚举排序:

select data, class, idx
from (select a.*,
             (@seqnum := if(@class = class, @seqnum + 1,
                            if(@class := class, 1, 1)
                           )
             ) as idx
      from atable a cross join
           (select @class := NULL, @seqnum := 0) vars
      order by class, data
     ) a
order by idx, class;

编辑:

此查询独立枚举每个类,因此具有最小数据的行的值为1,依此类推。它正在使用MySQL变量来实现此目的。在其他数据库中,您将使用row_number()。获得枚举后,最后一步就是按该字段排序。

答案 1 :(得分:0)

这是我可以建议的SQL:

SET @rank:=0;
update aabb set `index` = @rank:=@rank+2 where `class` = 'A';
SET @rank:=1;
update aabb set `index` = @rank:=@rank+2 where `class` = 'B';
select * from aabb order by `index`;