这篇文章将为大家详细讲解有关mysql 批量查询取每一组最新一条数据,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
MySQL 批量查询取每一组最新一条数据
问题描述
给定一个 MySQL 表,其中包含多个记录,需要编写一个 SQL 查询来获取每一组数据的最新一条记录。
解决方案
要获取每一组数据的最新一条记录,可以使用以下步骤:
1. 创建一个临时表(可选)
创建一个临时表来存储每个组的最新记录:
CREATE TEMPORARY TABLE LatestRecords AS
SELECT *, ROW_NUMBER() OVER (PARTITION BY group_column ORDER BY timestamp DESC) AS row_num
FROM original_table;
group_column
是用于对记录进行分组的列。timestamp
是用于确定最新记录的列。row_num
是一个新列,用于标识每一组中的最新记录。
2. 查询临时表
从临时表中选择 row_num
为 1 的记录,即每一组中的最新记录:
SELECT *
FROM LatestRecords
WHERE row_num = 1;
3. 直接查询原表(不使用临时表)
也可以直接从原表中查询最新记录,但效率可能会较低:
SELECT t1.*
FROM original_table t1
INNER JOIN (
SELECT group_column, MAX(timestamp) AS max_timestamp
FROM original_table
GROUP BY group_column
) t2 ON t1.group_column = t2.group_column AND t1.timestamp = t2.max_timestamp;
示例
假设有一个 customers
表,其中包含以下记录:
id | name | city | timestamp |
---|---|---|---|
1 | John | New York | 2023-01-01 |
2 | Mary | London | 2023-02-01 |
3 | Bob | Paris | 2023-03-01 |
4 | John | San Francisco | 2023-04-01 |
5 | Mary | New York | 2023-05-01 |
6 | Bob | London | 2023-06-01 |
使用创建临时表的方法:
CREATE TEMPORARY TABLE LatestRecords AS
SELECT *, ROW_NUMBER() OVER (PARTITION BY city ORDER BY timestamp DESC) AS row_num
FROM customers;
SELECT *
FROM LatestRecords
WHERE row_num = 1;
输出:
id | name | city | timestamp |
---|---|---|---|
4 | John | San Francisco | 2023-04-01 |
5 | Mary | New York | 2023-05-01 |
6 | Bob | London | 2023-06-01 |
使用直接查询原表的方法:
SELECT t1.*
FROM customers t1
INNER JOIN (
SELECT city, MAX(timestamp) AS max_timestamp
FROM customers
GROUP BY city
) t2 ON t1.city = t2.city AND t1.timestamp = t2.max_timestamp;
输出:
id | name | city | timestamp |
---|---|---|---|
4 | John | San Francisco | 2023-04-01 |
5 | Mary | New York | 2023-05-01 |
6 | Bob | London | 2023-06-01 |
以上就是mysql 批量查询取每一组最新一条数据的详细内容,更多请关注编程学习网其它相关文章!