mysql:如何在LEFT JOIN后保存ORDER BY而不重新排序?

2023-12-04

我有两张桌子:

1) profiles

+----+---------+
| id | name    |
+----+---------+
|  1 | WILLIAM |
|  2 | JOHN    |
|  3 | ROBERT  |
|  4 | MICHAEL |
|  5 | JAMES   |
|  6 | DAVID   |
|  7 | RICHARD |
|  8 | CHARLES |
|  9 | JOSEPH  |
| 10 | THOMAS  |
+----+---------+

2) request_for_friendship

+----+---------+-------+
| id | from_id | to_id |
+----+---------+-------+
|  1 |       1 |     2 |
|  2 |       1 |     3 |
|  3 |       1 |     8 |
|  5 |       4 |     1 |
|  6 |       9 |     1 |
+----+---------+-------+

我需要得到所有profiles进行一些排序并将其加入request_for_friendship

例如,对所有用户进行某种排序:

mysql>     SELECT *
    ->     FROM  profiles
    ->     ORDER BY name ASC;
+----+---------+
| id | name    |
+----+---------+
|  8 | CHARLES |
|  6 | DAVID   |
|  5 | JAMES   |
|  2 | JOHN    |
|  9 | JOSEPH  |
|  4 | MICHAEL |
|  7 | RICHARD |
|  3 | ROBERT  |
| 10 | THOMAS  |
|  1 | WILLIAM | <-- WILLIAM IS LAST!
+----+---------+

一切看起来都很好,排序已经存在。之后我加入request_for_friendship我的 sotring 会崩溃:

mysql> SELECT * FROM
    -> (
    ->     SELECT *
    ->     FROM  profiles
    ->     ORDER BY name ASC
    -> ) as users
    ->     LEFT JOIN request_for_friendship
    ->     AS request_for_friendship_copy
    ->     ON
    ->     (
    ->         request_for_friendship_copy.from_id = 1
    ->         AND
    ->         request_for_friendship_copy.to_id = users.id
    ->     )
    ->     OR
    ->     (
    ->         request_for_friendship_copy.from_id = users.id
    ->         AND
    ->         request_for_friendship_copy.to_id = 1
    ->     );
+----+---------+------+---------+-------+
| id | name    | id   | from_id | to_id |
+----+---------+------+---------+-------+
|  2 | JOHN    |    1 |       1 |     2 |
|  3 | ROBERT  |    2 |       1 |     3 |
|  8 | CHARLES |    3 |       1 |     8 |
|  4 | MICHAEL |    5 |       4 |     1 |
|  9 | JOSEPH  |    6 |       9 |     1 |
|  1 | WILLIAM | NULL |    NULL |  NULL | <-- WILLIAM IN THE MIDDLE!
|  5 | JAMES   | NULL |    NULL |  NULL |
|  6 | DAVID   | NULL |    NULL |  NULL |
|  7 | RICHARD | NULL |    NULL |  NULL |
| 10 | THOMAS  | NULL |    NULL |  NULL |
+----+---------+------+---------+-------+

How to JOIN LEFT with 原始排序 saving?

我无法对结果进行排序 JOIN LEFT因为当我这样做时ORDER BY before JOIN需要〜0.02秒in my db(~1 000 000 个用户)但是当我这样做时ORDER BY after JOIN大约需要 3.2 秒,时间非常长:(

演示:rextester.com/DLLM29415

演示:http://sqlfiddle.com/#!9/167792/1

在sqlfiddle中命令被保存!但如何呢? MySQL 5.6 保存命令吗?


(解释损失ORDER BY)

SQL 标准本质上说子查询是一组无序的行。这意味着优化器可以自由地忽略ORDER BY在“派生”表中:FROM ( SELECT ... ORDER BY )。在 MySQL 和 MariaDB 的“最新”版本中,这样ORDER BYs正在被丢弃。还有其他情况ORDER BY被忽略。

In some情况(不确定这个),添加一个LIMIT 99999999(大数字)之后ORDER BY欺骗优化器执行以下操作ORDER BY。不过,以后还是可以随意忽略这个“命令”的。

MySQL 的一般规则:避免子查询。 (在某些情况下子查询速度更快,但不是你的情况。)

强有力的规则:你must有一个ORDER BY如果您希望对结果进行排序,请放在最外面。

如果您添加了LIMIT 3对于第一个查询中的派生表,您只会得到 CHARLES、DAVID、JAMES、但不一定按照这个顺序。也就是说,你需要两个ORDER BYs- 一个在派生表中,一个在最后。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql:如何在LEFT JOIN后保存ORDER BY而不重新排序? 的相关文章

  • MySQL 错误 1172 - 结果包含多行

    在存储过程中运行查询时 我从 MySQL 收到此错误 错误代码 1172 结果包含多行 我理解错误 我正在做一个SELECT INTO var list 因此查询需要返回单行 当我使用LIMIT 1 or SELECT DISTINCT 错
  • Reporting Services 在哪里存储其日志文件

    最相关的谷歌结果似乎表明 为了访问日志 我们必须将您自己的日志表部署到数据库并制作报告服务写入它 http technet microsoft com en us library ms157403 aspx 简而言之 Reporting S
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • 根据另一列中的键累积一列中的值时出现问题

    我有一个看起来像这样的数据框 我需要使用 PROJ ID 列中的字符串创建一个新的值列 并形成 PROJ NAME 列中的值字符串 这里提供的解决方案 根据 r 中另一列的键累积一列中的值 https stackoverflow com q
  • st_intersects 与 st_overlaps

    这两个查询有什么区别 select a gid sum length b the geom from polygons as a roads as b where st intersects a the geom b the geom gr
  • H2 用户定义的聚合函数 ListAgg 不能在第一个参数上使用 DISTINCT 或 TRIM()

    所以我有一个 DB2 生产数据库 我需要在其中使用可用的函数 ListAgg 我希望使用 H2 的单元测试能够正确测试此功能 不幸的是H2不直接支持ListAgg 但是 我可以创建一个用户定义的聚合函数 import java sql Co
  • 将庞大数据库从亚马逊RDS导出到本地mysql

    我在 Amazon RDS 上有一个 mysql 数据库 大约 600GB 数据 我需要将其移回本地专用服务器 但我不知道从哪里开始 每次我尝试初始化 sqldump 时它都会冻结 有没有办法将其移至 S3 甚至可能在开始下载之前将其分成更
  • Mysql用in语句限制

    我正在写一个查询 SELECT user bookmarks id as user bookmark id bookmark id user bookmarks user id bookmark url bookmark website b
  • 如何检测Mysql/innodb中的死锁?

    我知道在 Innodb 中使用事务时不可避免地会发生死锁 并且如果应用程序代码正确处理死锁 它们是无害的 正如手册所说 只需再试一次 所以我想知道 如何检测死锁 死锁是否会发出一些特殊的 mysql 错误号 如果重要的话 我正在使用 PHP
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 随机组合 MySQL 数据库中的两个单词

    我有一个包含名词和形容词的数据库 例如 id type word 1 noun apple 2 noun ball 3 adj clammy 4 noun keyboard 5 adj bloody ect 我想创建一个查询 它将抓取 10
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • 如何获取自定义订单的结果? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 代替ASC or DESC 我希望我的查询结果采用特定的自定义顺序 例如 如果我想要的结果不是 A B C D 而是 P A L H 该怎么
  • SQL 更新 - 更新选定的行

    我正在使用 SQL Server 2008 我有一个名为MYTABLE有两列 ID STATUS 我想编写一个存储过程来返回其记录STATUS是 0 但是这个存储过程必须更新STATUS返回行数为 1 如何在单个查询中执行此选择和更新操作

随机推荐

  • 如何在 C++ 中创建文件映射?

    我正在编写一个游戏预加载器 一个简单的程序 在启动程序之前将某些文件 映射 加载到缓存中 我被告知要使用CreateFileMapping 但我仍然不确定它将它加载到物理内存还是虚拟内存中 不管怎样 我应该把需要加载的文件放在哪里 这是我的
  • Jersey 和 HK2 - 注入当前用户

    我正在使用 jersey 2 17 和 HK2 创建一个简单的休息应用程序 我有一个ContainerRequestFilter拒绝任何没有 currentuser cookie 的请求 我有这样的事情 Path users public
  • 远程运行 python 脚本的更好方法

    我在远程计算机上有一个 python 脚本 我想从本地计算机执行该脚本 它接受一些参数 如果我要在那台机器上运行它 这就是我运行它的方式 python python parallel py num 10 ssh home user1 pat
  • Javascript生成具有特定字母数量的随机密码[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我想在客户端的网页中用 JavaScript 生成密码 密码应使用字母和数字 也许还有一些符号 如何在 Javascript 中安全地生成密码 由于密码需要是不可预测的 因此它需要由
  • 使用 CSS 而不是 jquery 将图像置于 div 中居中

    我试图将任何大小的图像放入 始终 方形 div 中 并在父 div 的大小发生变化时保留外观 这就是我正在做的 CSS photo container width 250px height 250px overflow hidden bor
  • 一个可重用的函数,使用 html5 canvas 将图像剪辑成多边形

    猜测帖子的标题可能需要编辑 但目前我不知道问题出在哪里 我在这里和其他地方阅读了类似问题的页面和答案 Stack Overflow 的一个答案特别接近 但我不明白 我想要一个函数 在画布上所需的坐标处绘制多边形 并用从文件加载的一些背景图像
  • 从现有 MongoDB 数据库创建 Django 模型

    我在 MongoDB 中有一些数据库 我想为其动态创建模型 因为数据库很多 我无法手动完成 问题 我的 models py 应该是什么样子 inspectdb 是否适用于 mongodb 数据库或仅适用于基于 SQL 的数据库 由于数据库模
  • 终止的线程恢复

    我将一堆线程对象存储在数组列表中 我希望能够随机启动这些线程 同一个线程可以启动多次 在启动线程对象之前 我检查线程是否处于活动状态 以及它们是否具有 NEW 或 TERMINATED 状态 这个限制是因为 我不想打扰 繁忙 的线程 现在
  • VirtualBox 中的 Neo4j 服务器:无法创建 rrd 存储

    我正在尝试运行我的 Virtualbox 中的 Neo4j 服务器正在运行 Ubuntu 这服务器文件和数据库位于我的 Windows 主机内并可访问通过共享文件夹 vboxsf 不幸的是 我无法轻松地将数据传输到虚拟机并直接在那里运行 由
  • Android异常:您是否忘记调用“public void setup(LocalActivityManager ActivityGroup)”

    MyCode public class MainActivity extends Activity Override protected void onCreate Bundle savedInstanceState super onCre
  • PHP 时间戳直到“几小时前”的麻烦

    我需要确定我们网站上发布的评论的 时间之前 时间戳 我的老板希望它只显示到几个小时 因此它应该显示 48 小时前 而不是 2 天前 或 480 小时而不是 20 天前 这是我找到的代码 但直到几个小时我才知道如何做到这一点 date def
  • 禁用应用程序的 Android O 自动填充服务

    Android O 有支持的功能自动填充对于字段 有什么方法可以针对特定应用程序禁用它 也就是说 我想强制我的应用程序不使用自动填充服务 是否可以 要阻止整个活动的自动填充 请在活动的 onCreate 中使用它 getWindow get
  • 自动完成时触发了任何事件吗?

    我有一个非常简单的表格 当用户在输入字段中键入内容时 我想更新他们在页面其他位置键入的内容 这一切都很好 我已将更新绑定到keyup change and click events 唯一的问题是 如果您从浏览器的自动完成框中选择输入 它不会
  • 从触发器调用包含动态 SQL 的存储过程

    我从触发器调用存储过程并收到以下错误 存储函数或触发器中不允许使用动态 SQL 为什么会发生这种情况 动态SQL是在存储过程中执行的 这是从触发器调用的 也许这就是问题所在 如果是的话有什么解决办法吗 编辑 添加代码 这是主表中的触发器 T
  • 如何在Excel VBA中根据行和列ID查找单元格值

    需要 VBA Sub 来根据行和列 ID 查找单元格值 在下面的示例中 我需要选择 East 和 RT3 相交处的值 即 80 A B C D E 1 null RT1 RT2 RT3 RT4 2 North 31 40 78 11 3 S
  • 在后台运行 cgi shell 脚本

    我有一个像这样的cgi shell脚本 bin sh show the page echo Content type text html echo echo b Hello world b the task I want to do in
  • 如何以像素增量滚动 DataGridView

    我最初的方法是将 DataGridView 包含在面板内 将其高度设置在面板边界之外 然后更改控制面板的滚动条位置 然而 我刚刚发现我的 DataGridView 内的行数将达到 2000 这迫使我将 DataGridView 的大小至少设
  • 在后台进程后运行代码 - parse.com

    我的 viewController 中有一个 findObjectsInBackgroundWithBlock 方法 现在我想执行代码 但直到这个后台方法完成为止 我怎样才能做到这一点 我正在使用 swift 编程语言 这是一些可以帮助您的
  • Laravel Cookies 中的额外字符串和管道字符

    在我正在开发的 Laravel 6x 项目中 我设置了一个 cookie Cookie queue remember me json encode uid gt user gt id token gt token 2628000 我正在读取
  • mysql:如何在LEFT JOIN后保存ORDER BY而不重新排序?

    我有两张桌子 1 profiles id name 1 WILLIAM 2 JOHN 3 ROBERT 4 MICHAEL 5 JAMES 6 DAVID 7 RICHARD 8 CHARLES 9 JOSEPH 10 THOMAS 2 r