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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-25 06:18:09957浏览

How to Select Rows with the Maximum Datetime for Each Home in MySQL?

MySQL中按另一列分组选择具有最大列值的行

问题陈述

考虑以下玩家表现表:

<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列的行,同时考虑每个home的datetime列的最大值。此外,结果中应包含其他列(player等)。

示例数据

<code class="language-sql">INSERT INTO TopTen
  (id, home, `datetime`, player, resource)
VALUES
  (1, 10, '2009-04-03', 'john', 399),
  (2, 11, '2009-04-03', 'juliet', 244),
  (5, 12, '2009-04-03', 'borat', 555),
  (3, 10, '2009-03-03', 'john', 300),
  (4, 11, '2009-03-03', 'juliet', 200),
  (6, 12, '2009-03-03', 'borat', 500),
  (7, 13, '2008-12-24', 'borat', 600),
  (8, 13, '2009-01-01', 'borat', 700)
;</code>

预期结果

<code>id  home    datetime       player  resource
1   10     2009-04-03     john    399
2   11     2009-04-03     juliet  244
5   12     2009-04-03     borat   555
8   13     2009-01-01     borat   700</code>

解决方案

以下查询提供所需结果:

<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. 它从topten表(别名为tt)中选择所有列。
  2. 它使用内部联接将tt与子查询(别名为groupedtt)组合,该子查询检索每个不同的home值的datetime最大值。
  3. 联接条件确保两个表中的home和datetime值匹配。
  4. 结果包含来自topten表的所有列,按home分组并按每个home的datetime最大值过滤。

注意:我修正了日期格式,使其符合标准的YYYY-MM-DD格式,以确保MySQL能够正确解析。 这不会改变查询的逻辑,只会保证数据的正确性。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn