AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 109120
Accepted
itz_nsn
itz_nsn
Asked: 2015-08-06 11:52:31 +0800 CST2015-08-06 11:52:31 +0800 CST 2015-08-06 11:52:31 +0800 CST

MySQL中的ORDER BY FIELD()如何在内部工作

  • 772

我了解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 列排序?
mysql order-by
  • 2 2 个回答
  • 173154 Views

2 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2015-08-06T12:28:49+08:002015-08-06T12:28:49+08:00

    作为记录

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

    应该也可以,因为您不必在WHERE子句中对列表进行排序

    至于它是如何运作的,

    • FIELD()是一个函数,如果您要搜索的值存在,则返回逗号分隔列表的索引位置。

      • 如果 id = 1,则FIELD(id,3,2,1,4)返回 3(1 在列表中的位置)
      • 如果 id = 2,则FIELD(id,3,2,1,4)返回 2(2 在列表中的位置)
      • 如果 id = 3,则FIELD(id,3,2,1,4)返回 1(3 在列表中的位置)
      • 如果 id = 4,则FIELD(id,3,2,1,4)返回 4(4 在列表中的位置)
      • 如果 id = 其他任何内容,则FIELD(id,3,2,1,4)返回 0(不在列表中)
    • 这些ORDER BY值由FIELD()返回的值评估

    您可以创建各种花哨的订单

    例如,使用IF()函数

    SELECT * FROM mytable
    WHERE id IN (1,2,3,4)
    ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0),FIELD(id,3,2,1,4);
    

    这将导致前 4 个 id 出现在列表的顶部,否则,它会出现在底部。为什么?

    在 中ORDER BY,您得到 0 或 1。

    • 如果第一列为 0,则使前 4 个 id 中的任何一个出现
    • 如果第一列是 1,让它在后面出现

    让我们在第一列用 DESC 翻转它

    SELECT * FROM mytable
    WHERE id IN (1,2,3,4)
    ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0) DESC,FIELD(id,3,2,1,4);
    

    在 中ORDER BY,您仍然得到 0 或 1。

    • 如果第一列为 1,则显示除前 4 个 id 之外的任何内容。
    • 如果第一列为0,则使前4个id按原顺序出现

    您的实际问题

    如果您真的想了解这方面的内部信息,请转到本书的第 189 页和第 192 页

    MySQL 内部结构

    进行真正的深潜。

    本质上,有一个名为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 是被排序的值,同时携带对所涉及行的引用。

    • 98
  2. jkavalik
    2015-08-06T12:28:04+08:002015-08-06T12:28:04+08:00

    也许这与实际代码相差太远,因此与您想要的相比不够低:

    当 MySQL 无法使用索引按排序顺序检索数据时,它会创建一个包含所有选定列和一些附加数据的临时表/结果集 - 其中一个是用于存储每行 ORDER BY 表达式值结果的列 -然后它将这个 tmp 表发送到一个“文件排序”规则,其中包含要排序的列的信息。之后,行按排序顺序排列,因此它可以一一挑选它们并返回选定的列。

    • 1

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve