【问题标题】:mySQL order by certain values & then DESC?mySQL 按某些值排序,然后按 DESC?
【发布时间】:2011-11-22 12:08:30
【问题描述】:

假设我有一个 mySQL 表,其中有一个名为“name”的字段

此字段每行包含一个名称。

有 10 行:

Apple
Pear
Banana
Orange
Grapefruit
Pineapple
Peach
Apricot
Grape
Melon

如何形成查询,以便从表中进行选择,我希望详细信息显示如下:

Peach
Apple
Apricot
... and then everything else is listed by descending order.

所以基本上我想在列表的顶部显示几个指定的结果,然后按降序显示其余的结果。

谢谢。

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    你可以这样做:

    select *
    from fruit
    order by
        case name
            when 'Peach'   then 1
            when 'Apple'   then 2
            when 'Apricot' then 3
            else 4
        end,
        name
    

    这应该适用于任何 SQL 数据库。

    【讨论】:

      【解决方案2】:

      您可以使用IF() 函数对条件进行排序。 IF() 的文档指出:

      IF(expr1,expr2,expr3)

      如果 expr1 为 TRUE(expr1 0 且 expr1 NULL),则 IF() 返回 expr2;否则返回 expr3。 IF() 返回数字或字符串 值,取决于使用它的上下文。

      因此您可以使用它对顶部的特定元素进行排序,如下所示:

      SELECT *
      FROM fruit
      ORDER BY
          IF(name = 'Peach', 0, 1),
          IF(name = 'Apple', 0, 1),
          IF(name = 'Apricot', 0, 1),
          name DESC
      

      这是一系列命令,第一个具有最高优先级。因此,如果name='Peach',该值将为 0,对于所有其他值,该值为 1。由于在默认的 ASC 顺序中,0 在 1 之前,这确保了“Peach”将位于列表的顶部。系列中的第二个排序指定如何为第一个排序打破平局。在这种情况下,除 'Peach' 之外的所有元素都与值 '1' 在第一个排序中并列。在这种情况下,“Apple”被推到并列榜首,实际上是总榜的第二位。等等...一直到最后的“名称 DESC”。

      正如另一个答案指出的那样,CASE() 是一系列IF()s 的替代品:

      CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END

      第一个版本返回 value=compare_value 的结果。这 第二个版本返回第一个条件的结果,即 真的。如果没有匹配的结果值,ELSE之后的结果是 返回,如果没有 ELSE 部分,则返回 NULL。

      【讨论】:

        【解决方案3】:

        由于您使用的是 php,您可以将您的答案读入一个数组,将您想要的元素弹出到顶部,将它们存储在一个临时数组中。按字母顺序对原始数组进行排序,然后添加临时数组。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-29
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-15
          • 2020-02-15
          相关资源
          最近更新 更多