mysql根据某一字段获取最新一条数据的几种实现

在实际业务中,我们经常会遇到如何从同一个字段相同值中获取最新一条数据的问题。经自身积累以及百度之后,将常用的方法记录下来。

具体事例
由于使用的表的数据较多,所以只展示了部分数据
在这里插入图片描述

group by的方式

第一种

SELECT
	order_id,
	max( product_price ) AS product_price 
FROM
	oms_order_item 
GROUP BY
	order_id

得到的结果
在这里插入图片描述
注意:

SELECT
	id,
	order_id,
	max( product_price ) AS product_price 
FROM
	oms_order_item 
GROUP BY
	order_id

在这里插入图片描述

如上述SQL,若想获取其他字段的数据,而直接在SQL语句上增加该字段的话,查询到的结果是不一致的(product_price 最大的那条数据对应的id应该是25,而查询出来的id是21(默认显示分组后的第一条数据的值)),需注意。由于能力有限,具体原因并不知道。若有大佬知道,希望能给出答案。

第二种

SELECT
	a.id,
	a.order_id,
	a.product_price
FROM
	( SELECT * FROM oms_order_item ORDER BY product_price DESC LIMIT 10000 ) a 
GROUP BY
	order_id

在这里插入图片描述
因为在mysql5.7的时候,子查询的排序已经变为无效了,可能是因为子查询大多数是作为一个结果给主查询使用,所以子查询不需要排序的原因。
所以,对子查询的排序进行limit限制,此时子查询就不光是排序,此时排序会生效,但是限制条数却只能尽可能的设置大些。

窗口函数的方式

序号函数:ROW_NUMBER()、RANK()、DENSE_RANK()

SELECT
	a.id,
	a.order_id,
	a.product_price
FROM
	( SELECT order_id, ROW_NUMBER ( ) OVER ( PARTITION BY order_id ORDER BY product_price DESC ) AS price_order,product_price FROM t_score ) a

头尾函数:FIRST_VALUE(expr)、LAST_VALUE(expr)

SELECT
	id,
	order_id,
	product_price,
	FIRST_VALUE ( product_price ) OVER w AS first_price,
	LAST_VALUE ( product_price ) OVER w AS last_price 
FROM
	oms_order_item 
WINDOW w AS ( PARTITION BY order_id ORDER BY product_price )

由于mysql版本过低(8.0及以上才可使用窗口函数),无法使用。只是将用法记录一下。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值