栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

可以简化为以下内容(

ORDER BY
子查询中的没用):

SELECt * FROM tableGROUP 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.timestampORDER BY t.timestamp DESC

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

SELECt * FROM   ( SELECt *     FROM table     ORDER BY timestamp DESC   ) mGROUP BY title

可能会 按预期工作,但是: 在MySQL中,它允许您

SELECT
GROUPBY
子句中(或依赖于这些子句)的列表字段中使用,而其中没有任何聚合函数。因此,以上查询将为每个标题返回一个 或多或少的随机
行。实际上,它将返回找到标题的第一行。因此,首先运行子查询(按排序
timestamp DESC
)将导致首先找到时间戳最大的行。

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

如果MySQL在将来的版本中决定使用符合SQL标准的

GROUPBY
查询,您甚至可能会发现查询完全停止工作并产生错误。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/668631.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号