当前位置: 首页 > 面试题库 >

mysql:如何在不重新排序的情况下在LEFT JOIN之后保存ORDER BY?

沃威
2023-03-14
问题内容

我有两个桌子:

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我的哭泣将中断:

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 |
+----+---------+------+---------+-------+

如何JOIN LEFT原始分类 保存?

我无法对结果进行排序,因为* JOIN LEFT在数据库中 花费约0.02sORDER BY之前(约1000000个用户)就这样做了,但是当我花费约3.2s的时间后才这样做,这是非常大的时间:(JOIN *ORDER BY``JOIN

**演示: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被忽略。

某些 情况下(不确定这一点),在优化程序欺骗LIMIT 99999999后添加一个(大数字)。但是,以后仍然可以随意忽略“顺序”。ORDER BY``ORDER BY

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

一个强大的规则:你 必须 有一个ORDER BY,如果你想要的结果进行排序的最外层。

如果您LIMIT 3在第一个查询中已将其添加到派生表中,则只会得到CHARLES,DAVID,JAMES, 但不一定按该顺序
。也就是说,您将需要两个ORDER BYs-一个在派生表中,一个在最后。



 类似资料:
  • 问题内容: 如何在不同情况下( 大写 和 小写 )对带有varchar2列的表进行排序? 例如,当我按“名称”列进行排序时,将得到以下结果: 我想要的是这样的: 问题答案: 使用,例如 如果您需要解决非英语语言的特殊字符,则可能需要有关NLSSORT的其他答案。如果您不这样做,我会尝试和KISS一起使用,因为它很容易记住和使用,并被他人阅读(可维护性)。

  • 我的程序中只有两个线程。 我读过Java内存模型,从线程2中我所理解的读一个总是给我1。 我想知道我的理解是否正确。 特别是可以重新排序仍然发生,所以我看到a=0在第二个线程?

  • 问题内容: 退货 (至少在Activestate Python 3.1实现上。) 我知道这是一个奇怪的对象,因此如果它出现在排序结果中的随机位置,我不会感到惊讶。但这也弄乱了容器中非南数的排序,这确实是出乎意料的。 我问了一个相关的问题有关,并根据我理解为什么是这样工作的。但这应该被视为错误吗? 文档只是说“返回一个新的排序列表”,而没有指定任何详细信息。 编辑:我现在同意这不违反IEEE标准。但

  • 我正在使用redux saga。执行分派时,会执行likePost和addPost等函数。 然后每次我使用异步存储。获取令牌的getItem。换句话说,它是重叠的 因为我必须使用jwt令牌 我需要不断传递这样的头到api。这也是重叠 这个怎么用没有冗余,或者说怎么用最方便? 这是我的密码 (saga/post.js) (佐贺/index.js)

  • 我有一个用户名列表,用户名列表根据用户输入的数量而增加。问题是,当用户输入用户名时,列表会被输入填充,只有当我的页面重新加载时,我的页面才会更新。这是我迄今为止尝试过的代码。 我无法在外页重新加载的情况下更新数据。请建议我如何更新ui:在外页重新加载的情况下重复数据。提前谢谢。

  • 问题内容: 我一直在寻找一种不用使用collections.sort就可以对数组列表进行排序的方法,因为我自己的逻辑有缺陷,而且我遇到了很多麻烦。 我需要对它进行排序,以便可以使用我创建的一种方法,该方法基本上可以执行collections.swap的工作,以便对数组列表进行完全排序。 这是我的代码: 我对此一直很烦恼。抱歉,这是在伤害社区。 问题答案: 我想,你希望下面的算法:在阵列的其余部分发