需求: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
版权声明:本文为bronzehammer原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。