基于第一个排序的多个辅助排序

ycl3bljg  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(347)

我有一张有几列的表。我已将“数字”列按顺序排序。但是更难的是,我想对'letter'和'id'列进行排序,作为基于第一列的二级排序。“name”列只跟在“id”列之后,没有排序。
我尝试了一些不同的查询,包括 ORDER BY number, letter, id ,但这显然是相对于“letter”列对“id”列进行排序,这不是我想要的。我还搜索了其他sql子句,它们可能有助于我对两个独立的列进行排序,但到目前为止,大多数答案都使用 ORDER BY 关键字。
最终结果如下:

排序前

期望结果


“letter”和“id”都作为第二排序独立排序,相对于第一列(“number”),而“name”紧跟在“id”列之后。

编辑:

有人可能会说 ORDER BY number, letter, id 可以,但实际上每列都是基于前面排序的列而不是第一列进行排序的。这是使用命令时的结果。

tv6aics1

tv6aics11#

你可以做:

order by number, id
u59ebvdq

u59ebvdq2#

您正在尝试将值按列而不是按行排序。这很奇怪,但是可以在sql中完成。其思想是按每列中的有序值进行枚举,然后将它们连接在一起:

select tn.number, tn.letter, ti.id, ti.name
from (select t.*, (@rnl := @rnl + 1) as rn
      from (select t.* from t order by t.number, t.letter
           ) t cross join
           (select @rnl := 0) params
     ) tn join
     (select t.*, (@rni := @rni + 1) as rn
      from (select t.* from t order by t.number, t.id
           ) t cross join
           (select @rni := 0) params
     ) ti
     on tn.rn = ti.rn
order by tn.rn;

我们可以枚举整个表(即不取 number 考虑到)。子查询按顺序排列 number 首先,所以 rn 给定值 number 总是在同一范围内。

相关问题