我有两个表用户和 login_track 。每个用户可能在login_track表中有或没有登录记录。我想为每个用户检索最近2个登录日期。
表结构如下: 用户:
user_id name
1 John
2 Mike
3 Anderson
4 William
.....
Login_track表:
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表中没有记录,即使这两个也应该在最终结果中列出对login_date列的NULL值。
感谢。
答案 0 :(得分:1)
您可以使用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`
答案 1 :(得分:1)
由于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