【问题标题】:MySQL: Order by field, placing empty cells at endMySQL:按字段排序,将空单元格放在末尾
【发布时间】:2011-08-15 02:40:08
【问题描述】:

我有一个 MySQL 表,其中包含许多产品。我想要做的是按一个特定列对表进行排序(大多数值以数字开头,例如:1st、2nd)等。但是,由于某些记录没有此列的值,所以当我尝试排序时,表会自动将空行放在首位。

我正在寻找一种方法来对行 ASCENDING 进行排序,但只在排序记录的末尾插入空白记录,如果这有意义的话?

任何帮助将不胜感激!

【问题讨论】:

    标签: mysql sorting


    【解决方案1】:
    select * from table
    order by if(field = '' or field is null,1,0),field
    

    【讨论】:

    • @BenM:如果@nick 的回答解决了您的问题,您应该接受它。 @尼克:+1。
    • 如果可以的话,再问你一个简单的问题? stackoverflow.com/questions/5825875/mysql-sort-1st-before-101st
    • @Ken White - 我必须再等 2 分钟才能接受尼克的回答...
    • 简单一点:ORDER BY IF (`field` <> '', 0, 1)ASC;另外,在ORDER BY 子句中使用函数时要小心; MySQL 在这些情况下不能使用索引。这些查询可以在“小”表上正常工作,但随着项目规模的扩大,速度会急剧下降。
    【解决方案2】:

    这是最有效的方法之一

    ASC 顺序

    SELECT * FROM user ORDER BY name IS NULL, name ASC
    

    预期结果:

    +----+--------+------------+
    | id |  name  | date_login |
    +----+--------+------------+
    |  3 |  david | 2016-12-24 |
    |  2 |  john  | NULL       |
    |  4 |  zayne | 2017-03-02 |
    |  1 |  NULL  | 2017-03-12 |
    

    DESC 顺序

    SELECT * FROM user ORDER BY name IS NULL, name DESC
    

    预期结果:

    +----+--------+------------+
    | id |  name  | date_login |
    +----+--------+------------+
    |  4 |  zayne | 2017-03-02 |
    |  2 |  john  | NULL       |
    |  3 |  david | 2016-12-24 |
    |  1 |  NULL  | 2017-03-12 |
    

    【讨论】:

    • 这可以正常工作,并且是 NULL 值的最简单方法,但不适用于空字符串值。
    • 如果你需要同时测试NULL和空字符串,你可以做ORDER BY name IS NOT TRUE, name DESC
    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 2018-06-26
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2018-12-08
    • 1970-01-01
    相关资源
    最近更新 更多