MySQL使用GROUP BY分组后,获取每组中时间记录最新的行对应的其他字段

这篇具有很好参考价值的文章主要介绍了MySQL使用GROUP BY分组后,获取每组中时间记录最新的行对应的其他字段。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

在编写MySQL数据库查询语句时,经常遇到使用GROUP BY分组后,需要获取每组中时间记录最新的行对应的其他字段这一情况。例如下表(t_score):

id student course score examdate
1 小张 语文 89.0 2023-06-29
2 小张 数学 90.0 2023-06-29
3 小张 语文 91.0 2024-01-10
4 小张 数学 93.0 2024-01-10
5 小李 语文 89.0 2023-06-29
6 小李 数学 87.0 2023-06-29
7 小李 语文 90.0 2024-01-10
8 小李 数学 92.0 2024-01-10
CREATE TABLE t_score
(
  id INT PRIMARY KEY AUTO_INCREMENT
, student VARCHAR(20)
, course VARCHAR(20)
, score DECIMAL(20, 1)
, examdate DATE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1
DEFAULT CHARSET=utf8;

INSERT INTO t_score (student, course, score, examdate) VALUES ('小张', '语文', 89, '2023-06-29');
INSERT INTO t_score (student, course, score, examdate) VALUES ('小张', '数学', 90, '2023-06-29');
INSERT INTO t_score (student, course, score, examdate) VALUES ('小张', '语文', 91, '2024-01-10');
INSERT INTO t_score (student, course, score, examdate) VALUES ('小张', '数学', 93, '2024-01-10');
INSERT INTO t_score (student, course, score, examdate) VALUES ('小李', '语文', 89, '2023-06-29');
INSERT INTO t_score (student, course, score, examdate) VALUES ('小李', '数学', 87, '2023-06-29');
INSERT INTO t_score (student, course, score, examdate) VALUES ('小李', '语文', 90, '2024-01-10');
INSERT INTO t_score (student, course, score, examdate) VALUES ('小李', '数学', 92, '2024-01-10');

如果想要查询每个同学最新一次的数学成绩,以下语句无法查询到想要的数据。

SELECT s.id, s.student, s.course, s.score, MAX(s.examdate)
FROM t_score s
WHERE s.course = '数学'
GROUP BY s.student

查询结果是2023年6月29日小张和小李的成绩。
MySQL使用GROUP BY分组后,获取每组中时间记录最新的行对应的其他字段,MySQL,mysql,数据库
先对数据按时间倒序排列,再查询仍然不行。经了解是GROUP BY语句导致ORDER BY语句失效。

SELECT t.id, t.student, t.course, t.score, MAX(t.examdate) 
FROM (
	SELECT *
	FROM t_score s
	WHERE s.course = '数学'
	ORDER BY s.examdate DESC
) t
GROUP BY t.student

MySQL使用GROUP BY分组后,获取每组中时间记录最新的行对应的其他字段,MySQL,mysql,数据库

解决方法一

对数据排序后加LIMIT语句即可使排序生效,从而得到正确结果。

SELECT t.id, t.student, t.course, t.score, MAX(t.examdate) 
FROM (
	SELECT *
	FROM t_score s
	WHERE s.course = '数学'
	ORDER BY s.examdate DESC LIMIT 10000
) t
GROUP BY t.student

MySQL使用GROUP BY分组后,获取每组中时间记录最新的行对应的其他字段,MySQL,mysql,数据库

解决方法二

对数据排序时加GROUP BY id语句。

SELECT t.id, t.student, t.course, t.score, MAX(t.examdate) 
FROM (
	SELECT *
	FROM t_score s
	WHERE s.course = '数学'
	GROUP BY s.id
	ORDER BY s.examdate DESC
) t
GROUP BY t.student

解决方法三

先查询每组最新时间,再通过时间等字段联合原表查询。

SELECT a.*
FROM t_score a
INNER JOIN (
	SELECT s.student, s.course, MAX(s.examdate) examdate
	FROM t_score s 
	WHERE s.course = '数学'
	GROUP BY s.student
) b ON b.student = a.student AND b.course = a.course AND b.examdate = a.examdate

解决方法四

通过GROUP_CONCAT拼接时间与id字段,然后分解出id。

SELECT *
FROM t_score t
WHERE t.id IN 
(
	SELECT SUBSTRING_INDEX(GROUP_CONCAT(s.id ORDER BY s.examdate DESC, id DESC), ',', 1) id
	FROM t_score s
	WHERE s.course = '数学'
	GROUP BY s.student
)

也可以每个字段都通过GROUP_CONCAT拼接方式取值。

SELECT SUBSTRING_INDEX(GROUP_CONCAT(s.id ORDER BY s.examdate DESC), ',', 1) id
, s.student, s.course
, SUBSTRING_INDEX(GROUP_CONCAT(s.score ORDER BY s.examdate DESC), ',', 1) score
, MAX(s.examdate)
FROM t_score s
WHERE s.course = '数学'
GROUP BY s.student

也可以利用CONCAT_WS函数。

SELECT SUBSTRING_INDEX(MAX(CONCAT_WS(',', s.examdate, s.id)), ',', -1) id
, s.student, s.course
, SUBSTRING_INDEX(MAX(CONCAT_WS(',', s.examdate, s.score)), ',', -1) score
, MAX(s.examdate)
FROM t_score s
WHERE s.course = '数学'
GROUP BY s.student

参考文献

https://www.jb51.net/database/2949790kf.htm
https://blog.csdn.net/qq_39522120/article/details/108617552文章来源地址https://www.toymoban.com/news/detail-796884.html

到了这里,关于MySQL使用GROUP BY分组后,获取每组中时间记录最新的行对应的其他字段的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql通过group by分组取最大时间对应的数据,提供两种有效方法。

    1、项目记录表project_record的结构和数据如下: 以下为项目记录表 project_record 的所有数据。project_id为项目Id,on_project_time为上项目时间。(每一条数据代表着上某个项目(project_id)的时间(on_project_time)记录) 2、我们的需求是:取出每个项目中最大上项目时间对应的那条数据。

    2023年04月08日
    浏览(31)
  • group by进行分组时查询数据

    group by进行分组时查询数据需要注意:  select后的字段: 要么就要包含在Group By语句的后面,作为分组的依据;        要么就要被包含在聚合函数中。 错误: SELECT name, salary FROM student GROUP BY name        select 后的字段 salary 不在 group by 后面,所以salary无法显示全部值。 正确

    2024年02月11日
    浏览(23)
  • 【SQL】对表中的记录通过时间维度分组,统计出每组的记录条数

    场景:一般用作数据统计,比如统计一个淘宝用户在年、月、日的维度上的订单数。 业务:一个集合,以时间维度来进行分组求和。 准备一张订单表order,有一些常规属性,比如创建时间,订单号。 DDL语句如下: 测试数据准备如下,50条DML语句,其中order_date分布在2023年1月

    2024年01月16日
    浏览(34)
  • mysql 分组后取每组最新数据

    统计业务情况下,需要分组取最新,下面记录两种mysql写法 方式一:使用 MAX() 函数来实现该功能 方式二:和方式一逻辑基本一致,只是将IN查询替换成了连接查询,实测百万级数据量相较于方式一提升50%,推荐使用此种方式

    2024年02月10日
    浏览(39)
  • 【已解决】Mybatis 实现 Group By 动态分组查询

    🎉工作中遇到这样一个需求场景:实现一个统计查询,要求可以根据用户在前端界面筛选的字段进行动态地分组统计。也就是说, 后端在实现分组查询的时候,Group By 的字段是不确定的 ,可能是一个字段、多个字段或者不进行分组查询,这都是由用户在前端决定的。 💡这

    2024年02月11日
    浏览(27)
  • elasticsearch的group by分组和sum求和

    最近在使用es查询某个字段在特定查询条件下的某个字段的求和时,忘记了query语句是怎么写的,简单记录一下,方便自己和他人查阅。 一 什么是elasticsearch? elasticsearch是一个分布式的使用 REST 接口的搜索引擎,简称为ES,它是面向文档的,可以存储整个对象或文档。 二:

    2024年02月12日
    浏览(29)
  • ES聚合分页(group by分组后分页)

    案例:统计业务应用流量数据

    2024年02月11日
    浏览(44)
  • Mysql分组排序取每组第一条(二种实现方式)

    记录一下最近的一个需求,查不同产品排名第一的图片作为主图 其实一开始想用的是 mybatis的级联查询 ,结果说需要一次性全部查出来 那就没事了,改 sql 咯: 亲测实用 MySQL:8.0 Java:1.8 建表语句: 这一种也是网上推荐最多的,但个人觉得局限性太大,不介意用在实战上

    2024年02月06日
    浏览(29)
  • Mysql group by使用示例

    总数据: 索引情况:

    2024年02月11日
    浏览(24)
  • Mysql 查询分组数据中每组某一数值最大的数据

    该表表名为customer,  park_id表示园区id,joined_at表示用户的加入时间,created_at表示用户的创建时间。 需求:查出每个园区中,最早加入园区的第一位用户 查出id为 1和9的两条数据 解题思路:       【提示】  此处使用 limit 是为了确保,group by分组的时候会按照子查询中输出的

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包