关于数据库Group By取最新一条数据

示例表

在这里插入图片描述

查询期望结果

根据字段super_find_id分组查询opt_time最新的一条数据,如以上示例表中期望查询结果为第2条。

  • 先分组
	SELECT
		b.super_find_id,
		MAX( b.opt_time ) AS opt_time
	FROM
		info_super_feedback b
	GROUP BY
		b.super_find_id 

查询结果:
分组取最新
根据super_find_id字段分组取opt_time字段最新数据已成功,下一步是要取对应的全部字段值。

  • 查询分组后最新那条数据对应的全部表字段值
SELECT
	f.id,
	f.feedback_content,
	f.super_find_id,
	f.opt_time 
FROM
	( SELECT b.super_find_id, MAX( b.opt_time ) AS opt_time FROM info_super_feedback b GROUP BY b.super_find_id ) b
	INNER JOIN info_super_feedback f ON f.super_find_id = b.super_find_id AND f.opt_time = b.opt_time

查询结果:
分组后最新那条对应的全部表字段信息
与未分组前的原始数据相比:
在这里插入图片描述

结果

分组取最新的那条数据,查询结果尚未发现有误地方。若有更好方法,踊跃留言吧~~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 MySQL 中,要通过 GROUP BY 子句获最新一条记录,需要利用子查询和 ORDER BY 子句进行筛选。以下是具体步骤: 1.首先,使用子查询语句来查询每个组中最新的记录。例如:SELECT id, MAX(date) FROM table GROUP BY id 2.将该查询结果作为一个临时表,命名为 t1。 3.再次使用子查询从原表中获每个组中符合上一步查询结果的所有记录,例如:SELECT * FROM table WHERE (id, date) IN (SELECT id, MAX(date) FROM table GROUP BY id) 4.这样就能得到每个组中最新一条记录了。请注意,这种方法只适用于使用简单的 GROUP BY 语句的情况,如果使用复杂的 GROUP BY 语句,可能需要使用更复杂的查询方式。 总之,要通过 GROUP BY 最新一条记录,需要利用子查询和 ORDER BY 子句进行筛选。只有掌握了正确的查询方法,才能快速有效地查询数据库中的数据。 ### 回答2: MySQL中的GROUP BY关键字在处理一组数据时非常有用。可以使用它来对数据进行分组聚合并计算结果。然而,在实际开发中我们会遇到这样的场景:需要对一组数据进行分组,但只想每组数据最新一条记录。这时候,可以通过以下方式来完成这个需求: 假设我们有一张订单表(order)包含如下字段: id、order_no、customer_id、total_price、order_time 我们要按照客户ID进行分组,并且只每组中最新的订单记录,可以使用以下SQL语句: SELECT * FROM order o1 WHERE o1.id = ( SELECT MAX(o2.id) FROM order o2 WHERE o2.customer_id = o1.customer_id ) ORDER BY order_time DESC; 上面的查询语句会首先使用子查询获每个客户的最新订单记录的ID,然后通过外部查询来获完整的订单记录。 具体来说,子查询首先筛选出所有客户的订单记录,然后通过MAX()函数来得到每个客户的最新订单记录的ID。然后,外部查询使用这些最新记录的ID来获完整的订单记录,并按照订单时间倒序排列,最新的订单排在前面。 这种方式虽然可以满足我们的需求,但是它的效率非常低下,因为每个客户的记录都需要进行一次子查询才能得到最新的订单记录。当数据量较大时,这种查询会变得非常缓慢。 针对这个问题,我们可以使用MySQL中的JOIN子句来优化这个查询,通过一次连接来获每个客户的最新订单记录,从而提高查询效率。具体实现方式可以见下面的SQL语句: SELECT o1.* FROM order o1 INNER JOIN ( SELECT customer_id, MAX(id) as max_id FROM order GROUP BY customer_id ) o2 ON o1.customer_id = o2.customer_id AND o1.id = o2.max_id ORDER BY o1.order_time DESC; 上述SQL语句的实现原理与前面的查询类似,只是使用了JOIN字句,通过一次连接来获每个客户的最新订单记录。在这个查询中,内部子查询根据客户ID进行分组,并通过MAX()函数获每个客户的最新订单记录的ID和客户ID,然后JOIN操作使用这些ID来连接两张表,并出每个客户的最新订单记录。 总之,MySQL中可以通过group by和子查询或JOIN子句来最新一条数据,同时需注意性能问题。 ### 回答3: MySQL中的GROUP BY语句用于将查询结果按照某一列的值进行分组。但是,有时我们需要在每个分组中最新一条数据。这时,我们可以使用内联查询或LEFT JOIN语句。 1. 内联查询 内联查询是在SELECT语句中嵌套一个SELECT语句,用于在每个分组中获得最新一条数据。具体实现方式如下: ``` SELECT t1.* FROM table_name t1 INNER JOIN ( SELECT MAX(time_column) AS max_time FROM table_name GROUP BY group_column ) t2 ON t1.time_column = t2.max_time AND t1.group_column = t2.group_column; ``` 其中,t1为原始表,t2为内联查询的结果表。首先,内联查询获每个分组中的最新时间(MAX(time_column)),然后与原始表按时间和分组列进行JOIN操作,获每个分组中最新一条数据。 2. LEFT JOIN语句 LEFT JOIN语句也可以用于获每个分组中的最新数据。具体实现方式如下: ``` SELECT t1.* FROM table_name t1 LEFT JOIN table_name t2 ON t1.group_column = t2.group_column AND t1.time_column < t2.time_column WHERE t2.time_column IS NULL; ``` 其中,t1为原始表,t2为表t1自身按照分组列分组后,时间戳小于t1时间戳的表。LEFT JOIN操作保证了t1中的每一条数据都能在t2中找到对应的数据,且包括t1中的最新一条数据。WHERE语句过滤掉t2中的数据,只留下t1中独有的最新一条数据。 无论是内联查询还是LEFT JOIN语句,都需要依赖于数据表中某一列的时间戳信息来进行结果筛选。因此,在实际应用中,需要根据需求设计合适的数据库表结构,以便进行方便且高效的数据查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值