【问题标题】:MySQL Sort by two columns and the sort remaining records alphabeticallyMySQL 按两列排序并按字母顺序对剩余记录进行排序
【发布时间】:2015-07-23 17:04:44
【问题描述】:

我的 MySQL 表中有三三列:

title, featured, sort_order

其中titlevarcharfeaturedenum(“是”或“否”),sort_orderint

我想先返回特征为“YES”的结果集,然后将特征排序为“YES”,sort_order 升序(所以,0、1、2、3 等),然后按title ASC(按字母顺序)对剩余记录进行排序。

我查看了 GROUP BY 等,但在寻找答案时遇到了问题。

希望我想要完成的工作是有意义的。任何帮助将不胜感激:)

【问题讨论】:

    标签: mysql sorting multiple-columns


    【解决方案1】:

    你是说这个吗?

    select *, IF(featured = 'YES', 0, 1) AS ftsort, CAST(IF(featured = 'YES', sort_oder, title) AS CHAR) AS nosort 
    from table
    order by ftsort ASC, nosort ASC 
    

    【讨论】:

    • 呸...我才意识到这也不对。它确实将是/否分开,但否仍然首先按排序顺序排序,然后是 alpha。这不是 OP 想要的。
    • 这遇到了与我之前尝试回答(现已删除)相同的问题。启动 ORDER BY 后,第一个排序值的类型将用于将来的比较。意思是,您开始按 INT 排序,然后切换到 Varchar(),它会抛出异常“无法将 varchar 转换为 int。唉,我认为实现这一点的唯一方法是分别执行查询,并结合两者创建一个新结果。
    • 这似乎正在工作 - 并且适用于大型结果集。非常感谢。我永远不会想到这一点。如果有人能推荐一些关于 MySQL 的好书,那就太好了。多年来,我已经掌握了基础知识,但我很想有一个资源来了解更多!似乎有很多方法可以做事......
    • 这可能有效,但可读性一般,您不能混合使用ASCDESC 顺序序列。
    【解决方案2】:

    GROUP BY 会影响您获得的结果集,这是您不想要的:在以特定方式对返回值进行排序时,您需要使用 ORDER BY:

    SELECT FEATURED, SORT_ORDER, TITLE FROM your_table
    ORDER BY FEATURED, TITLE ASC, SORT_ORDER
    

    【讨论】:

    • 这不起作用。不过感谢您抽出宝贵时间来回答。
    【解决方案3】:

    将下面的 sql 转换为 MySQL(如果需要),这样就可以了。

    DECLARE @myTable as Table
    (
        title varchar(50),
        featured varchar(3),
        sort_order int
    )
    
    Insert INTO @myTable
        SELECT title, featured, sort_order
        FROM test1
        WHERE featured = 'YES'
        ORDER BY sort_order
    
    Insert INTO @myTable
        SELECT title, featured, sort_order
        FROM test1
        WHERE featured = 'NO'
        ORDER BY title ASC
    
    SELECT * FROM @myTable
    

    我相信以下 MySQL 版本是正确的(请验证)。

    Create TEMPORARY TABLE myTable 
    (
        title varchar(50),
        featured varchar(3),
        sort_order int
    );
    
    Insert INTO myTable
        (SELECT title, featured, sort_order
        FROM test1
        WHERE featured = 'YES'
        ORDER BY sort_order);
    
    Insert INTO myTable
        (SELECT title, featured, sort_order
        FROM test1
        WHERE featured = 'NO'
        ORDER BY title ASC);
    
    SELECT * FROM myTable
    

    当然,我的字段类型可能与你的不同,只需将 create 语句修改为正确的类型即可。

    【讨论】:

      【解决方案4】:

      就像 DiscipleMichael 提到的那样,您不能将 UNIONSELECT 一起使用 ORDER BY 子句。但是有一种解决方法,您可以将有序查询包装在子选择中。

      我会这样做:

      SELECT * FROM (SELECT title, featured FROM yourTable WHERE featured = 'YES' ORDER BY sort_order) AS featuredYES
      UNION
      SELECT * FROM (SELECT title, featured FROM yourTable WHERE featured = 'NO' ORDER BY title) AS featuredNO 
      

      这可能比搞砸ifs 更好:

      • 更具可读性;
      • 它允许您在需要时轻松添加另一个订单序列;
      • 如果需要,它允许您混合 ASCDESC 订单序列。

      【讨论】:

      • 缺少From 子句。添加后,MySql 会报告“Understanding use of Union and Order BY”。可能需要自定义程序。
      • @DiscipleMichael 谢谢。我修正了我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 2022-01-18
      • 1970-01-01
      • 2021-08-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多