【问题标题】:How to use "ORDER BY FIELD" to sort the result of a SQL如何使用“ORDER BY FIELD”对 SQL 的结果进行排序
【发布时间】:2018-06-18 03:00:11
【问题描述】:

如果有如下所示的数据;

id  cnt_stamp    
1  999 
2  3
3  9
4  3 
5  1000
6  30

如果输入按这个顺序是 (4, 1, 2, 3),我只想得到 (3, 999, 3, 9)。 为此,我创建了一个 SQL

SELECT `cnt_stamp`
FROM `stm_events`
ORDER BY FIELD(`id`, 4, 1, 2, 3);

但它会返回 (1000, 30, 3, 999, 3, 9)。我应该如何修复我的 SQL 以实现我的目标?感谢您抽出宝贵时间。

【问题讨论】:

  • 你想在最后显示 (1000, 30) 还是根本不显示?
  • 如果可能的话,我不想在最后显示 (1000, 30) ... @a1ex07
  • 需要用数据库引擎标记。 “字段”是一个非标准扩展,所以这将是 mysql 特定的。

标签: mysql sql sql-order-by field


【解决方案1】:

FIELD 会将NULL 分配给任何不匹配的id,并且默认情况下,空值在 MySQL 中首先排序。如果您根本不想看到不匹配的项目,您可以添加一个WHERE 子句:

SELECT cnt_stamp
FROM stm_events
WHERE id IN (1, 2, 3, 4)
ORDER BY FIELD(id, 4, 1, 2, 3);

如果您想查看所有数据,末尾有不匹配的id 值,则反转字段列表的顺序并降序排序:

SELECT cnt_stamp
FROM stm_events
ORDER BY FIELD(id, 3, 2, 1, 4) DESC;

Demo

【讨论】:

  • 感谢您的解决方案!我根本不想显示不匹配的项目,所以我拿了第一个,我工作了!这正是我想要的,您的解释帮助我理解了问题所在。谢谢!
【解决方案2】:

使用COALESCE函数:

SELECT `cnt_stamp` 
  FROM `stm_events` 
 ORDER BY COALESCE(`id`,FIELD(`id`,4,1,2,3));

SQL Fiddle Demo

【讨论】:

  • 感谢您的建议! COALESCE 可能是个好主意,但其他人已经给了我一个很好的解决方案,我接受了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 2021-10-07
  • 2011-09-13
相关资源
最近更新 更多