【问题标题】:Using FIELD() in ORDER BY clause - MySQL在 ORDER BY 子句中使用 FIELD() - MySQL
【发布时间】:2013-11-10 01:12:39
【问题描述】:

这是参考Ayman Hourieh给出的答案

问题: MySQL - ORDER BY values within IN()

SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')

FIELD 函数返回第一个字符串在剩余字符串列表中的位置。

因此它将类似于..ORDER BY 4ORDER BY 1,因为FIELD 函数返回位置。请解释ORDER BY 在这种情况下是如何工作的。

【问题讨论】:

  • 首先 - 请解释一下你想要什么
  • name 是您要订购结果的字段名称。另一个是结果索引,你想要的顺序索引。
  • “FIELD 函数返回第一个字符串在剩余字符串列表中的位置”——这是错误的。 FIELD 函数返回其非第一个参数的索引,该值与其第一个参数的值匹配。例如select FIELD('B', 'B', 'A', 'D', 'E', 'C') 将输出1select FIELD('A', 'B', 'A', 'D', 'E', 'C') 将输出2 等等。因此,您可以按 FIELD 返回的整数索引进行排序。

标签: mysql sql-order-by


【解决方案1】:

对于每一行,FIELD() 返回一个整数值。 然后按此值对行进行排序。

FIELD() 子句添加到选择部分应该有助于您了解它的工作原理:

SELECT id, name, FIELD(name, 'B', 'A', 'D', 'E', 'C')
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')

示例结果集:

 4 | Z | 0
12 | B | 1
 1 | B | 1
 6 | A | 2
 3 | E | 4

【讨论】:

  • SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C') ORDER BY 1 将给出按列号排序的结果。 SELECT 子句中的 1(即 id)。同样,SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C') ORDER BY 2 将给出按列号排序的结果。 2(即名称)在 SELECT 子句中。因此,问题。
  • 哦,我明白了,因为ORDER BY [litteral integer]ORDER BY [integer expression] 具有不同的效果,所以您会感到困惑。考虑这个查询:SELECT col FROM tab ORDER BY col。结果集将按col 排序,即使col 是数字。也许this fiddle 会有所帮助。
猜你喜欢
  • 2012-04-12
  • 2012-08-08
  • 1970-01-01
  • 2011-04-01
  • 2017-12-07
  • 2020-08-25
  • 2014-06-05
  • 2010-11-21
  • 1970-01-01
相关资源
最近更新 更多