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

本文介绍如何使用MySQL5+查询用户表userinfo,通过比较日期获取每个用户名下最新的登记号码,确保结果中每个username唯一且包含最新登记信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求: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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值