【问题标题】:MySQL sort DESC and ASCMySQL 排序 DESC 和 ASC
【发布时间】:2017-08-28 22:34:48
【问题描述】:

我有一个包含字段的表格:

id | group_id
1  | null
2  | null
3  | null
4  | 4
5  | 4
6  | 4
7  | 7
8  | 7
9  | null

我想将其排序为:

id | group_id
9  | null
7  | 7
8  | 7
4  | 4
5  | 4
6  | 4
3  | null
2  | null
1  | null

因此,总体而言,它是按 id 进行 DESC,但当它们共享 group_id 时按 id 进行 ASC

谢谢

【问题讨论】:

  • 我认为通过简单的订购是不可能的。基本上你不能同时对一个字段的多个方向进行排序(一些值 asc 和一些 desc)。您需要重新考虑您的问题并以不同的方式进行分析。
  • @Lamar 我会留下这个问题,以防有人有聪明的方法来解决问题,但我会在这里重新考虑我的问题并尝试以另一种方式分解它。谢谢
  • 组id可以高于id吗?例如。 id=1, group_id=12 可以是一个有效的条目(并且应该在底部排序吗?)并且是否有可能有一个条目具有组 id,而 id 具有组 id null? (例如可以有id=10, group_id=9id=9, group_id = null吗?

标签: mysql sql sorting


【解决方案1】:

试试看

Select id, group_id, coalesce(group_id, id) from table order by 3 desc, 1

【讨论】:

    【解决方案2】:

    我得到了这个工作:

    SELECT id, group_id, rank
    FROM (
      SELECT id, group_id, 
        @rank:=IF(group_id=@group_id,@rank,@rank+1) AS rank,
        @group_id:=group_id
      FROM MyTable CROSS JOIN (SELECT @rank:=0) AS _init
      ORDER BY id DESC
    ) AS t
    ORDER BY rank ASC, id ASC;
    

    输出:

    +----+----------+------+
    | id | group_id | rank |
    +----+----------+------+
    |  9 |     NULL | 1    |
    |  7 |        7 | 2    |
    |  8 |        7 | 2    |
    |  4 |        4 | 3    |
    |  5 |        4 | 3    |
    |  6 |        4 | 3    |
    |  3 |     NULL | 4    |
    |  2 |     NULL | 5    |
    |  1 |     NULL | 6    |
    +----+----------+------+
    

    您可以从外部查询的选择列表中省略 rank 列,我将其留在那里只是为了说明我如何对组进行排名。

    【讨论】:

      【解决方案3】:

      我不确定您是否可以对 id 列进行无序排序,但如果您需要的是共享组 id 的最低 id,那么像这样更新@Lamar 的答案就可以了

      SELECT MIN(id) AS id, group_id FROM table
      GROUP BY group_id
      ORDER BY IFNULL(group_id, 0) DESC, id DESC
      

      【讨论】:

      • 这会按组 id 对我的结果进行分组,我不希望对行进行任何“分组”,我只希望它们在“组”列中排序
      猜你喜欢
      • 2017-10-27
      • 2014-07-11
      • 2015-04-12
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      相关资源
      最近更新 更多