2017-06-30 2 views
1

J'ai deux tables utilisateurs et login_track. Chaque utilisateur peut avoir ou non des enregistrements de connexion dans la table login_track. Je veux récupérer les 2 dernières dates de connexion pour chaque utilisateur.Mysql Sélectionnez 2 enregistrements récents pour chaque groupe [utilisateur]

structure de tableau se présente comme suit: utilisateurs:

user_id name 
    1  John 
    2  Mike 
    3  Anderson 
    4  William 
    ..... 

table 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 

résultat si désiré doit être:

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 

Note: ID utilisateur 3 (Anderson) et 4 (William) n'a aucun dossier s dans la table login_track, même si ces deux éléments doivent également être listés dans le résultat final avec la valeur NULL dans la colonne login_date.

Merci.

+1

pouvez-vous montrer votre essai? – Jenish

Répondre

1

Il est un peu difficile que MySQL n'ont pas la fonction ROW_NUMBER(). Par conséquent avec un truc simple, essayez ceci:

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 

sortie:

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 
+0

J'ai besoin de tous les enregistrements de l'utilisateur table, à partir de votre solution les utilisateurs sans enregistrements dans login_track ne sont pas répertoriés. – orangetime

+0

Partager plus de données d'échantillon afin que je puisse vérifier? –

+0

mis à jour le résultat souhaité à la question. – orangetime

1

Vous pouvez utilisateur 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` 
+0

Il veut seulement 2 login_date pas tous –

+0

@jenish, les utilisateurs peuvent avoir zéro ou plusieurs enregistrements dans la table de piste de connexion. – orangetime

+0

vous pouvez définir la condition requise dans la condition où améliorer cette requête @orangetime – Jenish