首页  >  文章  >  数据库  >  如何在 MySQL 中分组之前按日期和时间对记录进行排序?

如何在 MySQL 中分组之前按日期和时间对记录进行排序?

Patricia Arquette
Patricia Arquette原创
2024-10-30 06:24:28593浏览

How to Sort Records by Date and Time Before Grouping in MySQL?

在 MySQL 中分组之前按日期和时间对记录进行排序

处理包含时间戳的表时,必须根据时间戳检索信息具体时间范围。然而,在按特定字段对记录进行分组之前按日期和时间排序可能会对 MySQL 造成挑战。

考虑下表:

name    date         time
tom | 2011-07-04 | 01:09:52
tom | 2011-07-04 | 01:09:52
mad | 2011-07-04 | 02:10:53
mad | 2009-06-03 | 00:01:01

要检索按名称分组的最旧记录,以下查询将失败:

SELECT * 
ORDER BY date ASC, time ASC 
GROUP BY name

此查询不起作用,因为 GROUP BY 必须出现在 ORDER BY 之前。然而,在排序之前进行分组会导致首先返回较新的“疯狂”记录,而不是较旧的记录。

要解决此问题,有多种方法可用:

子查询方法:

SELECT * 
FROM (
    SELECT * FROM table_name
    ORDER BY date ASC, time ASC 
) AS sub
GROUP BY name

此方法创建一个子查询,按日期和时间对记录进行排序,然后将结果传递到外部查询以按名称分组。由于 GROUP BY 对子查询中的第一个匹配记录进行操作,因此它会检索每个名称的最旧记录。

ROW_NUMBER() 方法:

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY date, time) AS row_num
    FROM table_name
) AS sub
WHERE row_num = 1

ROW_NUMBER( ) 为每个名称分区中的每一行分配一个序列号,按日期和时间排序。通过仅选择 row_num = 1 的记录,将选择每个名称的最旧记录。

MAX() 子查询方法:

SELECT *
FROM table_name
WHERE (date, time) IN (
    SELECT MAX(date) AS date, MAX(time) AS time
    FROM table_name
    GROUP BY name
)

此查询使用子查询为每个名称选择最大日期和时间。通过根据这些值过滤主查询,它会检索每个名称的最旧记录。

以上是如何在 MySQL 中分组之前按日期和时间对记录进行排序?的详细内容。更多信息请关注PHP中文网其他相关文章!

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