首页 > 数据库 > mysql教程 > 如何在 MySQL 中为每个 Home 选择具有最大日期时间的行?

如何在 MySQL 中为每个 Home 选择具有最大日期时间的行?

Linda Hamilton
发布: 2025-01-25 06:38:09
原创
248 人浏览过

How to SELECT Rows with the MAX Datetime for Each Home in MySQL?

MySQL:为每个组选择具有最大日期时间的行

本指南演示如何高效地检索包含 MySQL 表中每个不同组的最大日期时间值的行。 这是一个常见的 SQL 挑战,通常涉及子查询或窗口函数。

场景:

想象一个表格 (TopTen) 跟踪不同家庭的玩家资源使用情况:

<code class="language-sql">CREATE TABLE TopTen (
  id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  home INT UNSIGNED NOT NULL,
  datetime DATETIME NOT NULL,
  player VARCHAR(6) NOT NULL,
  resource INT NOT NULL
);</code>
登录后复制

目标是为每个 home 查找具有最新 (datetime) 条目的记录,包括该最新记录中的 playerresource 信息。

低效方法(以及失败的原因):

简单的 GROUP BYMAX() 无法直接工作,因为 GROUP BY 聚合数据,丢失像 player 这样的非聚合列。 尝试使用子查询查找每个家庭的最大日期时间,然后连接回原始表通常会导致不正确或不完整的结果。

有效的解决方案:

最有效的解决方案利用带有子查询的自连接:

<code class="language-sql">SELECT tt.*
FROM TopTen tt
INNER JOIN (
    SELECT home, MAX(datetime) AS MaxDateTime
    FROM TopTen
    GROUP BY home
) groupedtt ON tt.home = groupedtt.home AND tt.datetime = groupedtt.MaxDateTime;</code>
登录后复制

此查询的工作原理是:

  1. 子查询 (groupedtt): 此内部查询查找每个 datetime 的最大值 home,并按 home 对结果进行分组。
  2. 连接: 外部查询将原始表(TopTen 别名为 tt)与子查询的结果连接起来。 JOIN 条件确保只有与 home 和最大 datetime 都匹配的行才会包含在最终结果中。

此方法确保为每个 player 代表最大 resource 的行返回原始表中的所有列(包括 datetimehome)。 这可以避免数据丢失并提供所需的完整信息。

以上是如何在 MySQL 中为每个 Home 选择具有最大日期时间的行?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板