【问题标题】:MySQL order by two columns in or-clauseMySQL 在 or 子句中按两列排序
【发布时间】:2016-02-12 10:10:10
【问题描述】:

我在 MySQL 中有一个表,其中包含如下数据:

id name      first_name
===============================
1  hello     
2            many
3            alive
4  persons

我怎样才能使结果看起来像这样

id name      first_name
===============================
3            alive
1  hello     
2            many
4  persons

那么,排序应该按姓名和/或名字的字母顺序排列?

【问题讨论】:

    标签: mysql sql-order-by multiple-columns


    【解决方案1】:

    下面的查询可以完成这项工作。

    SELECT *
    FROM nameTable
    ORDER BY IFNULL(name,first_name)
    

    SELECT *
    FROM nameTable
    ORDER BY coalesce(name,first_name)
    

    N:B:如果您无法访问SQL FIDDLE

    CREATE TABLE `nameTable` (
    `ID`  int(11) NOT NULL AUTO_INCREMENT ,
    `name`  varchar(50) CHARACTER SET latin1 COLLATE latin1_general_ci NULL DEFAULT NULL ,
    `first_name`  varchar(50) CHARACTER SET latin1 COLLATE latin1_general_ci NULL DEFAULT NULL ,
    PRIMARY KEY (`ID`)
    );
    
    INSERT INTO `nametable` VALUES ('1', 'hello', null);
    INSERT INTO `nametable` VALUES ('2', null, 'many');
    INSERT INTO `nametable` VALUES ('3', null, 'alive');
    INSERT INTO `nametable` VALUES ('4', 'persons', null);
    

    注意:

    两者的主要区别在于IFNULL 函数接受两个参数,如果不是NULL,则返回第一个参数;如果第一个参数是NULL,则返回第二个参数。

    COALESCE 函数可以接受两个或多个参数并返回第一个非NULL 参数,如果所有参数都是null,则返回NULL。

    【讨论】:

    • 如果值为空字符串而不是 null,则这些解决方案不起作用。 @randyh22 解决方案适用于 null 或空字符串。
    【解决方案2】:

    我找到了解决方案,顺序应该是这样的

    order by coalesce(name,first_name)
    

    【讨论】:

    • 如果值是空字符串而不是 null,这将不起作用。 @randyh22 解决方案适用于 null 或空字符串。
    【解决方案3】:

    创建一个排序列,它是其他两个列的串联。

    SELECT id, `name`, first_name, CONCAT(IFNULL(`name`,''),IFNULL(first_name,'')) AS sortby
    FROM
    table1
    ORDER BY sortby
    

    【讨论】:

      【解决方案4】:

      使用这个

      SELECT * FROM A ORDER BY CONCAT(name,first_name) ASC 
      

      【讨论】:

      • 如果值为 null 而不是空字符串,这将不起作用。 @randyh22 解决方案适用于 null 或空字符串。
      猜你喜欢
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2018-09-10
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      相关资源
      最近更新 更多