需求:MySQL5+ 处理,下面表中,用户名相同的数据,取最新登记日期的登记号码
表名:userinfo
用户名(username) | 登记号码 (regis_num) | 登记时间(regis_date) |
---|---|---|
zhuangsan | 56 | 2022-06-01 |
zhuangsan | 12 | 2022-05-01 |
zhuangsan | 59 | 2022-04-01 |
lisi | 66 | 2022-05-01 |
lis | 76 | 2022-04-01 |
最终结果:
用户名(username) | 登记号码 (regis_num) | 登记时间(regis_date) |
---|---|---|
zhuangsan | 56 | 2022-06-01 |
lisi | 66 | 2022-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