sql - 如何使用其他字段作为排序顺序进行排序?

Posted

技术标签:

【中文标题】sql - 如何使用其他字段作为排序顺序进行排序?【英文标题】:sql - How to order by using other field as sort order? 【发布时间】:2015-03-16 23:19:31 【问题描述】:

我有一个包含两个字段的表格,名称和日期,比如说:

name   |   date
A         1/12/15
D         1/11/15
C         1/11/15
A         1/10/15
C         1/09/15
B         1/09/15
A         1/08/15

我想按名称对其进行排序,以便所有相同名称的名称一起出现,但按日期排序,这样第一个名称将是日期较近的名称。

所以我会得到:

name   |   date
A         1/12/15
A         1/10/15
A         1/08/15
D         1/11/15
C         1/11/15
C         1/09/15
B         1/09/15

因为如果我使用orderby name, date desc;然后名称按字母顺序排列,我不希望这样。

【问题讨论】:

【参考方案1】:

将表格与自身连接,您可以在其中按名称分组并获取每个名称的最新日期。然后您可以按最新日期排序,然后按名称(将相同的名称放在一起,其中最新日期恰好相同),然后按日期。

select
  t.name,
  t.date
from
  TheTable as t
  inner join (
    select
      name,
      max(date) as date
    from
      TheTable
    group by
      name
  ) as x on x.name = t.name
order by
  x.date desc,
  t.name,
  t.date desc

【讨论】:

【参考方案2】:

我认为这就是你想要的 (see SQL Fiddle demo here):

SELECT n1.name, n1.dt
  FROM nd n1 INNER JOIN (
    SELECT name, MAX(dt) AS max_dt
      FROM nd
     GROUP BY name
  ) n2
   ON n1.name = n2.name
ORDER BY n2.max_dt DESC, n1.dt DESC

请记住,因为CD 的最近日期都是1/11/2015,所以先出现的日期是未定义的,没有额外的排序。

【讨论】:

以上是关于sql - 如何使用其他字段作为排序顺序进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

sql 如何优先显示不为空的字段 并进行排序

想问下,sql 按 in 后的顺序排序问题。

SQL按照指定顺序对字段进行排序

按查询的where子句中的字段顺序对sql查询的结果进行排序

Mysql中ORDER BY 排序怎么使用?指定顺序和多字段排列

如何对mySQL数据库中某些特定字段进行排序?