【问题标题】:Using ORDER BY FIELD and another (second) ORDER clause in one query在一个查询中使用 ORDER BY FIELD 和另一个(第二个)ORDER 子句
【发布时间】:2013-04-09 02:19:01
【问题描述】:

This question 询问有关在 MySQL 中指定排序顺序的问题。

我想做的是有两个级别的排序 - 第一个是我指定的顺序,然后其余的非指定值将以正常方式排序。

我尝试的是:

    SELECT
        version_id,
        version_name
    FROM
        software_versions
    ORDER BY 
        FIELD(version_id, 133, 41, 88), 
        version_name ASC

但是发生的情况是,行是按版本名称排序的,然后是 FIELD(从查询的结构向后)。

可以按照我的要求做吗?查找表相对较小(大约 100 行),所以我不太担心使用 ORDER BY FIELD 会影响性能。

我需要将其作为 UNION 重做吗?

【问题讨论】:

  • 您有版本 id 133、41 和 88 吗?我们可以假设 versionid 是一个数字字段吗?
  • 将 FIELD 子句添加到 SELECT 列表中:它给你什么?

标签: mysql sql-order-by


【解决方案1】:

尝试颠倒顺序,这样0 将始终位于最后一个位置。

ORDER BY FIELD(version, 88, 41, 133) DESC,  version_name ASC

【讨论】:

    【解决方案2】:

    我发现这个article 解释它。基本上,因为您没有指定所有版本号,所以它不起作用。解决方法是先按字段函数排序,然后按字段本身。

    ORDER BY FIELD(version, 88, 41, 133) DESC, version, version_name;
    

    【讨论】:

      【解决方案3】:

      这是因为您没有在 FIELD() 函数中列出 version_id 的所有可能值。

      这应该可以工作:

      SELECT
          version_id,
          version_name
      FROM
          software_versions
      WHERE
          version_id IN (133, 41, 88)
      ORDER BY 
          FIELD(version_id, 133, 41, 88), 
          version_name ASC
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 2011-07-06
        • 2020-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多