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