基于第一排序的多个二级排序

时间:2018-12-26 10:25:55

标签: mysql sql database sorting

我有一张桌子,上面有几列。我对“数字”列进行了排序。但是,更困难的部分发生了,我想基于第一列对“ Letter”和“ id”列进行次级排序。 “名称”列仅在“ id”列之后,而不进行排序。

我尝试了几种不同的查询,包括ORDER BY number, letter, id,但是显然这相对于'Letter'列对'id'列进行了排序,这不是我想要的。我还搜索了其他可能有助于我对两个独立列进行排序的SQL子句,但到目前为止,大多数答案都使用ORDER BY关键字。

最终结果应如下所示:

排序前

Before Sorting

所需结果

After Sorting

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

编辑:

有人可能说ORDER BY number, letter, id有用,但是实际上每个列都是根据先前的排序列而不是第一列进行排序的。如果使用该命令,这就是结果。

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以:

order by number, id

答案 1 :(得分:0)

您正尝试在中而不是在中对值进行排序。那很奇怪,但是可以用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的{​​{1}}值将始终在同一范围内。