【问题标题】:ORDER BY grouped fieldsORDER BY 分组字段
【发布时间】:2014-01-26 08:02:48
【问题描述】:

我有一个 MySQL 表,其中有一列 sector。我有 5 种扇区类型:1、1&2、2、3 和未知。 我需要按扇区顺序获取结果集,顶部为:扇区 1、1&2、未知(混合),然后是扇区 2,最后是扇区 3。

是否可以直接在 SQL 中执行此操作,还是必须使用 PHP 处理?

示例

| **sector** |
|     1      |
|  unknown   |
|     2      |
|    1&2     |
|     3      |
|     1      |

需要的结果是:

sector 1&2
sector 1
sector unknown
sector 1
sector 2
sector 3

【问题讨论】:

  • 我试过 ORDER BY FIELD(sector, '1', '1&2', 'unknown', '2', '3'),效果很好,但我需要第一组(sector 1 , 1&2 和未知)进行混合。例如,扇区 1 可以随机出现在未知或 1&2 之后。

标签: mysql sql select sql-order-by


【解决方案1】:

使用FIELD()函数

试试这个:

SELECT * FROM tableA 
ORDER BY FIELD(sector, '1&2', '1', 'unknown', '2', '3')

SELECT * FROM tableA 
ORDER BY CASE WHEN sector IN ('1&2', '1', 'unknown') THEN 1 
              WHEN sector = '2' THEN 2 
              WHEN sector = '3' THEN 3 ELSE 4 
         END 

【讨论】:

  • 我实际上完全按照你提到的那样使用字段。它工作正常,但我需要混合第一组(扇区 1、1&2 和未知)。例如,扇区 1 和 2 可以随机出现在扇区 1 之前或未知之后。
  • @user2733521 添加示例输入数据和所需的输出。并明确你想要什么
【解决方案2】:

可能是这样的:

order by case
 when sector=1 then 0
 when sector='1&2' then 1
 when sector='unknown' then 1.5
 when sector=2 then 2
 when sector=3 then 3
 end

您可能必须将此虚拟字段添加到具有别名的选定字段中,并且您必须按顺序使用别名。

【讨论】:

  • 与字符串和数字相比,看到相同的字段有点奇怪。在这种情况下,您确实应该引用所有选项。 - 你也可以在这里使用更短的语法,因为这些都是简单的比较。 CASE sector WHEN '1' THEN 0 ...
猜你喜欢
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2011-05-25
  • 2019-10-29
  • 2020-10-11
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多