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

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

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
查询,您甚至可能会发现查询完全停止工作并产生错误。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5673885.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存