在 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中文网其他相关文章!