SQL多列排序


634

我试图按SQL中不同方向的多个列进行排序。column1将按降序和column2升序排序。

我怎样才能做到这一点?


85
这是“搜索答案”的第一个结果。至少是在我用Google搜索“按两列排序SQL”时。它比等效的官方文档页面更具可读性,直到我将查询更改为“ mysql'order by'”之前,它都没有出现在结果的第一页中
Andrew Martin

11
考虑到SO问题多久出现在Google的头上,我总是觉得人们用它回答很可怕。SO要么在这里回答,要么不回答,我不明白为什么引导站点访问量是一件好事
user001 2015年

Answers:


1022
ORDER BY column1 DESC, column2

每当两行或更多行的字段相等时,这将column1首先按(降序)排序,然后按column2(升序,默认设置)对所有内容进行排序column1


2
这里如何订购column1或column2?
PoliDev

@PoliDev,它首先按DESCending顺序按column1和by column2(按ASCending顺序)进行排序
zaheer 2014年

110
为了清楚起见,这将column1首先对所有内容进行排序,然后column2column1两行的字段相等时对所有内容进行排序。
尼克·贝恩斯

2
它将适用于任意数量的表达式(不仅限于列),并且不超过RDBMS的限制。
伊格纳西奥·巴斯克斯

2
@NickBenes ...或者您可以说:它按排序column2,然后按进行稳定的排序column1。对于知道什么是稳定排序的人来说,这更加清楚。
Atom

356

其他答案缺少一个具体的示例,因此请按以下步骤进行:

给定以下人员表:

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826

如果执行以下查询:

SELECT * FROM People ORDER BY FirstName DESC, YearOfBirth ASC

结果集将如下所示:

 FirstName |  LastName   |  YearOfBirth
----------------------------------------
  Thomas   | More        |   1478
  Thomas   | Jefferson   |   1826
  Thomas   | Alva Edison |   1847
  Benjamin | Franklin    |   1706

23
这个答案是对非常有用且简短的答案的很好的补充。
enderland 2014年

3
这是一个很好的例子,许多人认为即使您将2列用于订单查询,如何也不能一次对2列进行排序
Muhammad Faraz

当我们对三列进行排序并且第一列的排序顺序相同并且其余所有内容都不相同时,它将提供相同的结果。例如:1.Firstname asc, Lastname desc, yearOfBirst asc and 2.Firstname asc, Lastname desc, yearOfBirst desc 有什么方法可以克服这个问题?
Paramesh Korrakuti

1
@ParameshKorrakuti:那是预期的结果。在您的示例中,如果重复的FirstName, LastName条目具有不同的条目,则结果的排序将有所不同YearOfBirth
Thomas CG de Vilhena,

感谢您的示例,它使像我这样的人理解。
蒂普


19

多列排序取决于两列的对应值:这是我的表格示例,其中两列以字母和数字命名,这两列中的值分别为ascdesc顺序。

在此处输入图片说明

现在,通过执行以下命令,在这两列中执行“ 订购依据”:

在此处输入图片说明

现在再次在这两列中插入新值,其中字母值按ASC顺序排列:

在此处输入图片说明

并且“示例”表中的列如下所示。现在再次执行相同的操作:

在此处输入图片说明

您可以看到第一列中的值按desc顺序排列,但第二列中的值不按ASC顺序排列。


也要插入此数据(g, 10),(g,12)。然后,运行您的order-by查询,您将获得第二列作为ASC订单(这意味着g-10,g-11,g-12)
Pugal

6

您可以在多种条件下使用多种顺序,

ORDER BY 
     (CASE 
        WHEN @AlphabetBy = 2  THEN [Drug Name]
      END) ASC,
    CASE 
        WHEN @TopBy = 1  THEN [Rx Count]
        WHEN @TopBy = 2  THEN [Cost]
        WHEN @TopBy = 3  THEN [Revenue]
    END DESC 

如果我在“ ORDER BY”中使用“ CASE”,索引是否起作用?
Rousonur Jaman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.