Mysql为每个组[用户]选择最近的2条记录

时间:2017-06-30 07:34:16

标签: mysql greatest-n-per-group group-concat

我有两个表用户 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值。

感谢。

2 个答案:

答案 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