【问题标题】:Sort with one option forced to top of list使用一个选项进行排序,强制排在列表顶部
【发布时间】:2010-09-10 02:55:46
【问题描述】:

我有一个向用户显示选项列表的 PHP 应用程序。该列表是从针对 SQL 2000 的简单查询生成的。我想做的是在列表顶部有一个特定选项,然后将其余选项按字母顺序排序。

例如,以下是按字母顺序排序的选项:

Calgary  
Edmonton  
Halifax  
Montreal  
Toronto  

我希望列表更像这样:

**Montreal**  
Calgary  
Edmonton  
Halifax  
Toronto  

有没有一种方法可以让我使用单个查询来做到这一点?还是我卡住了两次运行查询并附加结果?

【问题讨论】:

    标签: sql sorting


    【解决方案1】:
    SELECT name
    FROM locations
    ORDER BY
        CASE
            WHEN name = 'Montreal' 
            THEN 0
            ELSE 1
        END, name
    

    【讨论】:

      【解决方案2】:
      SELECT name FROM options ORDER BY name = "Montreal", name;
      

      注意:这适用于 MySQL,而不是像 OP 请求的 SQL 2000。

      【讨论】:

      • 我尝试了您的解决方案,但它在 Order By 中的 = 上引发了 SQL 语法错误。不过谢谢你的想法。
      • 啊,是的,我一定一直在考虑 MySQL 语法:D
      【解决方案3】:
      create table Places (
          add Name varchar(30),
          add Priority bit
      )
      
      select   Name
      from     Places
      order by Priority desc,
               Name
      

      【讨论】:

        【解决方案4】:

        我在一个充满案例报告的网站上遇到了类似的问题。我希望已知受害者姓名的案例报告排在最前面,因为它们更引人注目。相反,我希望所有 John Doe 案件都在底部。由于这也涉及到人名,所以我也遇到了名字/姓氏排序问题。我不想把它分成两个名称字段,因为有些案例根本不是人。

        我的解决方案:

        我有一个显示的“名称”字段。我还有一个“NameSorted”字段,用于所有查询但从不显示。我的输入 UI 负责将输入到排序字段的“LAST,FIRST”自动转换为显示版本。

        最后,为了“装配”排序,我只需将适当的字符放在排序字段的开头即可。因为我想让东西在最后出来,所以我把“zzz”放在开头。要在顶部排序,您可以输入“!”一开始。同样,您的编辑 UI 可以为您处理这些问题。

        是的,我承认它有点俗气,但它确实有效。对我来说,一个优势是我必须在不同的地方进行更复杂的查询来生成页面而不是 RSS 等,而且我不必记住一个复杂的表达式来正确排序,它总是按“NameSorted " 字段。

        单击我的个人资料以查看生成的网站。

        【讨论】:

          【解决方案5】:

          我最终得到了这个

          SELECT name
          FROM locations
          LEFT JOIN (VALUES ('Toronto', 1), ('Montreal', 2)) city (name, rank)
              ON locations.name = city.name
          ORDER BY city.rank, locations.name;
          

          对于这个例子来说这可能是多余的,但可以扩展以满足更复杂的需求。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-02-22
            • 2018-07-09
            • 2021-02-05
            • 1970-01-01
            • 2012-06-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多