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

ORDER BY子查询,用于GROUP BY到JOIN的转换

家西岭
2023-03-14
问题内容

我有这张table

id |   title   | amount | timestamp
1  |  random1  |   150  | 1313635011
2  |  random2  |   190  | 1313635730
3  |  random2  |   210  | 1313637359
4  |  random2  |   100  | 1313691807
5  |  random3  |   130  | 1313692673
6  |  random4  |   900  | 1313692739
7  |  random4  |   111  | 1313692988

我想得到这个结果(行与不同的标题和最大的时间戳):

id |   title   | amount | timestamp
1  |  random1  |   150  | 1313635011
4  |  random2  |   100  | 1313691807
5  |  random3  |   130  | 1313692673
7  |  random4  |   111  | 1313692988

我有这个查询。

SELECT * FROM (
  SELECT * FROM table ORDER BY timestamp DESC 
) m GROUP BY title

它可以用作魅力,但是可以将其转换为JOIN语句吗?

谢谢


问题答案:

可以简化为以下内容(ORDER BY子查询中的没用):

SELECT * 
FROM table
GROUP BY title

为什么您认为自己需要JOIN?(好的,这已通过评论解决)。

在对每个标题(具有最大时间戳的行)进行注释之后,这将完成工作:

SELECT t.* 
FROM
    table AS t
  JOIN
    ( SELECT title
           , MAX(timestamp) AS maxts
      FROM table
      GROUP BY title
    ) AS grp
    ON grp.title = t.title
    AND grp.maxts = t.timestamp
ORDER BY t.timestamp DESC

作为记录,您的原始查询:

SELECT * 
FROM 
  ( SELECT * 
    FROM table 
    ORDER BY timestamp DESC 
  ) m
GROUP BY title

可能会 按预期工作,但是: 在MySQL中,它允许您SELECTGROUP BY子句中(或依赖于这些子句)的列表字段中使用,而其中没有任何聚合函数。因此,以上查询将为每个标题返回一个 或多或少的随机
行。实际上,它将返回找到标题的第一行。因此,首先运行子查询(按排序timestamp DESC)将导致首先找到时间戳最大的行。

但是,仅由于(当(如果)时)优化器不了解子查询是无用的,才会发生这种情况。一天升级到MySQL
7.5版后,您的原始查询可以正常运行,并且查询像以前一样停止工作。(因为优化器变得更聪明,并且无需子选择即可将查询翻译成更简单的查询)。

如果MySQL在将来的版本中决定使用符合SQL标准的GROUPBY查询,您甚至可能会发现查询完全停止工作并产生错误。



 类似资料:
  • 本文向大家介绍关于laravel 子查询 & join的使用,包括了关于laravel 子查询 & join的使用的使用技巧和注意事项,需要的朋友参考一下 本项目中关联了2个数据库 在某个需求中,需要使用子查询获取snapshot快照表库的关联数据,从而实现以下sql逻辑 其中子查询主要用到以下query builder语句 而join语句中可传入匿名函数重新构造,如再其中加多几个连接条件,或者查

  • 1)使用的第一个查询...大约用了23秒 目前我修改了查询..这需要大约9秒 我不确定要做的表演是什么?我希望这个查询是快速的..我尝试索引rid和id,但这仍然使查询变得更糟。 下面是表格的详细信息 mza_movie_upload MZA_Movie_Statics

  • 问题内容: 我正在使用angular-filter中的 groupBy 按对象的date属性对对象数组进行分组。 产生以下内容: 如何从最近的日期开始颠倒顺序?当我打印到控制台时,以我想要的顺序打印阵列: 我还编写了一个自定义过滤器来反转groupBy之后的顺序: 我已经这样申请了: 问题答案: 最近有同样的问题。创建一个对象,但需要一个数组,因此涉及一些时髦。我最终从他们的问题页面直接得到了答案

  • 问题内容: 我想知道使用INNER JOIN -clause的SQL查询的django等效项。我有两个与ForeignKey链接的模型。 我想从“表”中将“ item_is_locked”值设置为false的请求表中获取字段 如果使用SQL查询,我将使用以下代码: 问题答案: 您可以使用和获得所需的结果。 尝试:

  • 我尝试使用多个自定义字段显示结果,同时按第一个自定义字段(startdate)排序结果。我看到的建议让我尝试了以下方法: 问题是,如果没有meta_key参数,结果会默认过滤帖子的日期。当我添加meta_key参数对结果进行排序时,我得到的每一篇文章都有一个meta_key等于开始日期。通过添加这些meta_key参数,语句似乎完全忽略了meta_query数组中的条件。我如何让查询排序的开始日期

  • 目前,我正在为客户列表开发一个“过滤器”功能。 我有以下子查询,我不确定是否有办法用CriteriaBuilder构建它。它也可以在没有multiselect但是我需要、和来选择最小值。结果应该是一个数字。 例如客户余额表 更新:这是我当前的代码,但是 如何为我的子查询添加排序依据 如何设置maxResult 谢谢!B