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

具体事例

由于使用的表的数据较多,所以只展示了部分数据

mysql 取表里最新的所有记录 mysql 取最新一条数据_数据

group by的方式

第一种

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

得到的结果

mysql 取表里最新的所有记录 mysql 取最新一条数据_字段_02


注意:

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

mysql 取表里最新的所有记录 mysql 取最新一条数据_mysql_03

如上述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

mysql 取表里最新的所有记录 mysql 取最新一条数据_数据_04


因为在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及以上才可使用窗口函数),无法使用。只是将用法记录一下。