我有一个包含数据和类的表,比如
----------------
| 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吗?
答案 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`;