【问题标题】:Ordering by specific field value first首先按特定字段值排序
【发布时间】:2012-12-15 18:11:28
【问题描述】:

我有一个包含 3 列的表格:

id | name | priority
--------------------
 1 | core  |   10
 2 | core  |   9
 3 | other |   8
 4 | board |   7
 5 | board |   6
 6 | core  |   4

我想使用priority 对结果集进行排序,但首先是那些具有name=core 的行,即使优先级较低。结果应该是这样的

id | name | priority
--------------------
 6 | core  |   4
 2 | core  |   9
 1 | core  |   10
 5 | board |   6
 4 | board |   7
 3 | other |   8

【问题讨论】:

    标签: mysql sql select sql-order-by


    【解决方案1】:

    使用这个:

    SELECT * 
    FROM tablename 
    ORDER BY priority desc, FIELD(name, "core")
    

    【讨论】:

      【解决方案2】:

      还有MySQL FIELD function

      如果您想对所有可能的值进行完整排序:

      SELECT id, name, priority
      FROM mytable
      ORDER BY FIELD(name, "core", "board", "other")
      

      如果您只关心“核心”是第一位的,而其他值无关紧要:

      SELECT id, name, priority
      FROM mytable
      ORDER BY FIELD(name, "core") DESC
      

      如果要先按“核心”排序,其他字段按正常排序:

      SELECT id, name, priority
      FROM mytable
      ORDER BY FIELD(name, "core") DESC, priority
      

      这里有一些警告:

      首先,我很确定这是 mysql 独有的功能 - 问题被标记为 mysql,但你永远不知道。

      其次,注意FIELD() 的工作原理:它返回值的从1 开始的索引 - 对于FIELD(priority, "core"),如果“core”为价值。如果该字段的值不在列表中,则返回。这就是为什么DESC 是必需的,除非您指定所有可能的值。

      【讨论】:

      • 大约 5 年后,我将接受的答案更改为这个答案,因为它更清洁、更快。
      • db2 等效项?
      • 它对我有用,想再问一个关于如何处理的问题如果列“优先级”包含诸如 ex:“地球核心”、“新板”等值。这里的列不包含确切的值,我们可以写类似 %core% 的东西吗?
      • @JayanthSuvarna:查看 MySQL FIELD() 文档,我很确定没有任何方法可以将其评估为子字符串,因为每个参数都必须是某种字符串。可能有一些字符串操作函数可以提供帮助,但我不确定。
      • 谢谢,伙计。你让我开心。
      【解决方案3】:
      SELECT * FROM cars_new WHERE status = '1' and car_hide !='1' and cname IN ('Executive Car','Saloon','MPV+','MPV5') ORDER BY FIELD(cname, 'Executive Car', 'Saloon','MPV+','mpv5')
      

      【讨论】:

      • 虽然你的代码可能是问题的答案,但最好提供一些解释。
      【解决方案4】:

      这样做:

      SELECT * FROM table ORDER BY column `name`+0 ASC
      

      附加 +0 意味着:

      0, 10, 11, 2, 3, 4
      

      变成:

      0, 2, 3, 4, 10, 11
      

      【讨论】:

      • 此技术用于将字符串转换为数字。它没有解决 OP 的问题。 (但是,在没有看到 priority 的数据类型的情况下,我不能说它是否应该是完整解决方案的一部分。)
      【解决方案5】:

      一般都可以

      select * from your_table
      order by case when name = 'core' then 1 else 2 end,
               priority 
      

      尤其是在 MySQL 中你也可以这样做

      select * from your_table
      order by name <> 'core',
               priority 
      

      由于 MySQL 中的比较结果是 01,因此您可以按该结果进行排序。

      【讨论】:

      • 这里的12 是什么意思?
      • 我有大约 3000 行要排序。在我的情况下,@Ayman-Hourieh 在stackoverflow.com/questions/958627/… 上的解决方案与此解决方案相比需要一半的时间。
      • @nightlyop:很好。只有一点:更快的解决方案是特定于 MySQL 的。
      • 12 只是我用来对数据进行排序的 2 个数字。可能是34 或其他。
      • WHERE 子句中有% 怎么办?喜欢. . . WHERE name LIKE '%sth%' . . .stackoverflow.com/questions/41303379/…
      【解决方案6】:

      这适用于我使用 Postgres 9+:

      SELECT *
      FROM your_table
      ORDER BY name = 'core' DESC, priority DESC
      

      【讨论】:

      • 想解释一下-1?错误 + Postgres 版本?
      【解决方案7】:

      一种方法是这样的:

      select id, name, priority from table a
      order by case when name='core' then -1 else priority end asc, priority asc
      

      【讨论】:

      • 这不会丢失core 行的顺序吗?
      【解决方案8】:

      优先考虑特定行的一种方法是将大量数字添加到它们的优先级中。您可以使用CASE 声明来做到这一点:

        select id, name, priority
          from mytable
      order by priority + CASE WHEN name='core' THEN 1000 ELSE 0 END desc
      

      演示:http://www.sqlfiddle.com/#!2/753ee/1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-03
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多