【笔记】MySQL 5+ 相同用户的数据,取最新登记日期的那条

需求:MySQL5+ 处理,下面表中,用户名相同的数据,取最新登记日期的登记号码

表名:userinfo

用户名(username)登记号码 (regis_num)登记时间(regis_date)
zhuangsan562022-06-01
zhuangsan122022-05-01
zhuangsan592022-04-01
lisi662022-05-01
lis762022-04-01

最终结果:

用户名(username)登记号码 (regis_num)登记时间(regis_date)
zhuangsan562022-06-01
lisi662022-05-01

注意:要保证用户名username 的值是唯一的

解决方法:

SELECT
	a.username,
	a.regis_num,
	a.regis_date 
FROM
	(
SELECT
	t.username,
	t.regis_num,
	t.regis_date,
IF
	( @username= t.username, @ranks := @ranks + 1, @ranks := 1 ) AS ranks,
	@username:= t.username 
FROM
	( SELECT username, regis_num, regis_date FROM userinfo ORDER BY username, regis_date DESC ) t,
	( SELECT @username:= NULL, @ranks := 0 ) s 
	) a 
WHERE
	a.rank = 1
										

思路:
定义两个变量 @username, @ranks ,针对查询出的每条数据,判断@username= t.username 是否成立,如果成立,则该条数据的 ranks 值加1,否则默认返回为1,并且 @username的值重新赋值为该条数据的username

对于MySQL 8+ 版本 可以使用 ROW_NUMBER() OVER() 方式处理

SELECT
	a.username,
	a.regis_num,
	a.regis_date 
FROM ( 
		SELECT 
			username, 
			regis_num, 
			regis_date, 
			ROW_NUMBER () OVER (PARTITION BY username ORDER BY regis_date DESC ) AS ranks 
		FROM userinfo 
) a WHERE a.ranks = 1

版权声明:本文为bronzehammer原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。