Mysql Select 每个组[用户]最近2条记录
Mysql Select recent 2 records for each group[user]
我有两个 table 的 用户 和 login_track。每个用户在 login_track table 中可能有也可能没有登录记录。我想为每个用户检索最近 2 个登录日期。
Table结构如下:
用户:
user_id name
1 John
2 Mike
3 Anderson
4 William
.....
Login_track table:
track_id user_id login_date
100 1 2017-06-20
101 1 2017-06-21
102 2 2017-06-21
103 1 2017-06-23
104 2 2017-06-23
105 1 2017-06-27
所以想要的结果应该是:
user_id Name login_date
1 John 2017-06-27, 2017-06-23
2 Mike 2017-06-23, 2017-06-21
3 Anderson NULL
4 William NULL
注意:用户 id 3 (Anderson) 和 4 (William) 在 login_track table 中没有记录,即使这两个也应该在最终结果中列出 login_date列。
谢谢。
您可以使用 GROUP_CONCAT()
SELECT substring_index(group_concat(login_date SEPARATOR ','), ',', 2) AS login_date FROM `Users` LEFT JOIN `Login_track` ON `Login_track`.`user_id` = `users`.`id` GROUP BY `users`.`id`
这有点棘手,因为 MySQL 没有 ROW_NUMBER() 函数。因此,使用一个简单的技巧,试试这个:
Select u.user_id, u.name, GROUP_CONCAT(DISTINCT iq.login_date) login_date
FROM(
select user_id, login_date
from
(
select user_id, login_date,
(@num:=if(@group = user_id, @num +1, if(@group := user_id, 1, 1))) row_number
from Login_track
CROSS JOIN (select @num:=0, @group:=null) c
order by user_id, login_date DESC
) as x
where x.row_number <= 2
)iq
right join users u on u.user_id = iq.user_id
GROUP BY u.user_id
输出:
user_id name login_date
------- ---- -----------
1 John 2017-06-23,2017-06-27
2 Mike 2017-06-21,2017-06-23
3 Anderson NULL
4 William NULL
我有两个 table 的 用户 和 login_track。每个用户在 login_track table 中可能有也可能没有登录记录。我想为每个用户检索最近 2 个登录日期。
Table结构如下: 用户:
user_id name
1 John
2 Mike
3 Anderson
4 William
.....
Login_track table:
track_id user_id login_date
100 1 2017-06-20
101 1 2017-06-21
102 2 2017-06-21
103 1 2017-06-23
104 2 2017-06-23
105 1 2017-06-27
所以想要的结果应该是:
user_id Name login_date
1 John 2017-06-27, 2017-06-23
2 Mike 2017-06-23, 2017-06-21
3 Anderson NULL
4 William NULL
注意:用户 id 3 (Anderson) 和 4 (William) 在 login_track table 中没有记录,即使这两个也应该在最终结果中列出 login_date列。
谢谢。
您可以使用 GROUP_CONCAT()
SELECT substring_index(group_concat(login_date SEPARATOR ','), ',', 2) AS login_date FROM `Users` LEFT JOIN `Login_track` ON `Login_track`.`user_id` = `users`.`id` GROUP BY `users`.`id`
这有点棘手,因为 MySQL 没有 ROW_NUMBER() 函数。因此,使用一个简单的技巧,试试这个:
Select u.user_id, u.name, GROUP_CONCAT(DISTINCT iq.login_date) login_date
FROM(
select user_id, login_date
from
(
select user_id, login_date,
(@num:=if(@group = user_id, @num +1, if(@group := user_id, 1, 1))) row_number
from Login_track
CROSS JOIN (select @num:=0, @group:=null) c
order by user_id, login_date DESC
) as x
where x.row_number <= 2
)iq
right join users u on u.user_id = iq.user_id
GROUP BY u.user_id
输出:
user_id name login_date
------- ---- -----------
1 John 2017-06-23,2017-06-27
2 Mike 2017-06-21,2017-06-23
3 Anderson NULL
4 William NULL