【问题标题】:mysql SQL: specific item to be first and then to sort the rest of the itemsmysql SQL:将特定项目放在第一位,然后对其余项目进行排序
【发布时间】:2011-03-24 10:49:39
【问题描述】:

假设我有下表。

我想获得所有朋友,但我希望 id 5 成为列表中的第一项。我不在乎我收到其余物品的顺序。

所需的查询结果将是:

friends
-------

id    name

5     nahum
1     moshe
2     haim
3     yusuf
4     gedalia
6     dana

我该怎么做?

使用 Mysql 5.1.x.

谢谢!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    select id,name 
    from friends 
    order by id=5 desc
    

    (假设你不关心其余的顺序,否则,例如 rest by id asc

    select id,name 
    from friends 
    order by id=5 desc, id asc
    

    【讨论】:

    • @maxx777 这个问题的标签是 MySQL,它现在归 Oracle 所有。不像 Microsoft SQL Server 中的“sql-server”。
    • 我认为大多数查询都适用于所有 DBMS。如果有人说此查询不适用于特定 DBMS,通常他是在为该特定 DBMS 寻求解决方案。
    • @maxx777 这就是为什么我们有标签和单独的问题。它适用于询问他的 MySQL 问题的人。如果您想要 SQL Server 2005,另一个答案就是它,无需评论这个答案显然不适用于它从未宣传过的工作。
    【解决方案2】:

    试试这个:

    select id,name 
    from friends 
    order by case when id=5 then -1 else id end
    

    如果你有更多,你可以做:

    select id,name 
    from friends 
    order by case when id in (5,15,25) then -1 else id end,id
    

    【讨论】:

      【解决方案3】:

      我现在无法访问 MySQL 进行测试,因此可能会颠倒过来……但您可以使用布尔值也可以排序的事实,并且可以有多个排序字段。

      SELECT ... ORDER BY id != 5, id
      

      (你可能必须写id = 5,我不记得 TRUE 是在 FALSE 之前还是之后排序的。)

      编辑:哦,我刚刚读到您不关心其余部分的顺序,在这种情况下,我衷心推荐@Richard 的答案。

      【讨论】:

      • 我更喜欢id=5 desc,因为当列包含空值时,!=5 会将空值放在首位
      【解决方案4】:

      您可以在 MySQL 中使用field()

      select id,name from friends order by field(id,5,id)
      

      field() 中的第一个参数表示要排序的字段,其余为排序。

      所以 5 将首先排序,其余从 id 排序(没有 5)。如果你想让 5,1,3 排在前面,你可以像 field(id,5,1,3,id) 一样。

      5 可以选择最后按field(id,id,5) 排序。第二个 id 也将排除 5。

      【讨论】:

        【解决方案5】:

        如果您想对 UNION 查询执行相同的操作,例如,如果您有:

        select id,name 
        from friends 
        UNION
        select id,name 
        from friends 
        order by id=5 desc
        

        ...你会在 PostgreSQL 中得到一个异常:

        只能使用结果列名,不能使用表达式或函数。提示:将表达式/函数添加到每个 SELECT,或将 UNION 移动到 from 子句中

        要解决这个问题,您可以使用以下方法:

        select id,name, (id=5) AS is_five
        from friends 
        UNION
        select id,name, (id=5) AS is_five
        from friends 
        order by is_five DESC, id DESC
        

        表达式 (id=5) 将返回“t”或“f”,具体取决于您的列值是否等于预期值 (5),因此 order by 将首先对“t”列进行排序,然后是其余的。

        【讨论】:

          【解决方案6】:

          您应该使用 MySQL 的 ORDER BY FIELD 子句来解决这个问题。虽然,答案已被接受,但这里有一个更好的解决方案。

          select 1 id, 'Zeta' order_col union all
          select 2 id, 'Alpha' order_col union all
          select 3 id, 'Gamma' order_col union all
          select 4 id, 'Phi' order_col union all
          select 5 id, 'Delta' order_col union all
          select 6 id, 'Delta' order_col union all
          select 7 id, 'Alpha' order_col union all
          select 8 id, 'Gamma' order_col union all
          select 9 id, 'Zeta' order_col union all
          select 10 id, 'Phi' order_col 
          order by field (order_col, 'Alpha', 'Gamma', 'Phi', 'Delta', 'Zeta'), id;
          

          这比

          • id=something,按 id asc 排序
          • 按大小写顺序,当某事然后 1 当某事_else 然后 2 结束 desc 时

          【讨论】:

          • 不知道为什么这被否决了。我想知道为什么按字段排序应该更好,但答案很有趣..
          • @John - 这更好主要是因为易于阅读。此外,它是 MySQL 为我们提供的开箱即用的解决方案。在我看来,当您必须为列中的许多值指定顺序时,这更有意义。
          • 我认为人们根本不明白您提供了一个带有“union all”的示例以及带有 ORDER BY 字段的问题的解决方案。因此,downvotes,这只是由于无能。
          • 我检查所有答案时牢记@Strawberry 的帖子 - meta.stackoverflow.com/questions/333952/…
          【解决方案7】:

          这有点难看,因为它有代码重复,但它可以解决问题:

          select .... where id = 5 
          union
          select .... where not id = 5
          

          【讨论】:

          • 如果行在联合之后保持有序,那只是个意外。如果你指定order by,它会对整个联合进行排序。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-16
          • 2018-08-02
          • 1970-01-01
          • 2018-02-27
          • 2022-01-11
          • 2021-09-24
          • 1970-01-01
          相关资源
          最近更新 更多