admin

交织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吗?


阅读 182

收藏
2021-06-07

共1个答案

admin

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

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()。进行枚举后,最后一步就是按该字段排序。

2021-06-07