我了解ORDER BY
子句的工作原理以及FIELD()
功能的工作原理。我想了解的是他们两个如何一起工作来排序。如何检索行以及如何得出排序顺序
+----+---------+
| id | name |
+----+---------+
| 1 | stan |
| 2 | kyle |
| 3 | kenny |
| 4 | cartman |
+----+---------+
SELECT * FROM mytable WHERE id IN (3,2,1,4) ORDER BY FIELD(id,3,2,1,4)
上面的查询将导致
+----+---------+
| id | name |
+----+---------+
| 3 | kenny |
| 2 | kyle |
| 1 | stan |
| 4 | cartman |
+----+---------+
类似于说 ORDER BY 3, 2, 1, 4 的东西
问题
- 这在内部如何运作?
- MySQL如何获取行,并计算排序顺序?
- MySQL 如何知道它必须按 id 列排序?
作为记录
应该也可以,因为您不必在
WHERE
子句中对列表进行排序至于它是如何运作的,
FIELD()是一个函数,如果您要搜索的值存在,则返回逗号分隔列表的索引位置。
这些
ORDER BY
值由FIELD()返回的值评估您可以创建各种花哨的订单
例如,使用IF()函数
这将导致前 4 个 id 出现在列表的顶部,否则,它会出现在底部。为什么?
在 中
ORDER BY
,您得到 0 或 1。让我们在第一列用 DESC 翻转它
在 中
ORDER BY
,您仍然得到 0 或 1。您的实际问题
如果您真的想了解这方面的内部信息,请转到本书的第 189 页和第 192 页
进行真正的深潜。
本质上,有一个名为
ORDER *order
(ORDER BY
表达式树)的 C++ 类。在JOIN::prepare
,*order
中使用了一个名为 的函数setup_order()
。为什么在JOIN
课堂中间? 每个查询,甚至是针对单个表的查询都始终作为 JOIN 处理(请参阅我的帖子JOIN 条件和 WHERE 条件之间存在执行差异吗?)这一切的源代码是
sql/sql_select.cc
显然,这
ORDER BY
棵树将持有 的评估FIELD(id,3,2,1,4)
。因此,数字 0,1,2,3,4 是被排序的值,同时携带对所涉及行的引用。也许这与实际代码相差太远,因此与您想要的相比不够低:
当 MySQL 无法使用索引按排序顺序检索数据时,它会创建一个包含所有选定列和一些附加数据的临时表/结果集 - 其中一个是用于存储每行 ORDER BY 表达式值结果的列 -然后它将这个 tmp 表发送到一个“文件排序”规则,其中包含要排序的列的信息。之后,行按排序顺序排列,因此它可以一一挑选它们并返回选定的列。