2017-06-30 2 views
1

Ich habe zwei Tabellen Benutzer und login_track. Jeder Benutzer kann Login-Einträge in der login_track-Tabelle haben oder nicht. Ich möchte die letzten 2 Anmeldedaten für jeden Benutzer abrufen.Mysql Wählen Sie die letzten 2 Datensätze für jede Gruppe [Benutzer]

Tabellenstruktur ist wie folgt: Benutzer:

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

Login_track Tabelle:

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 

So gewünschte Ergebnis sein sollte:

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 

Hinweis: User-ID 3 (Anderson) und 4 (William) hat keine Aufzeichnung s in der login_track-Tabelle, obwohl diese beiden auch im Endergebnis mit dem Wert NULL zur Spalte login_date aufgelistet werden sollten.

Danke.

+1

können Sie Ihren Versuch zeigen? – Jenish

Antwort

1

Es ist ein bisschen schwierig, weil MySQL nicht ROW_NUMBER() Funktion. Daher mit einem einfachen Trick, versuchen Sie dies:

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 

Ausgang:

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

Ich brauche alle Datensätze vom Benutzer Tabelle, von Ihrer Lösung Benutzer ohne Datensätze in login_track ist nicht aufgelistet. – orangetime

+0

Teilen Sie mehr Beispieldaten, damit ich es überprüfen kann? –

+0

aktualisiertes gewünschtes Ergebnis zu der Frage. – orangetime

1

können Sie Benutzer 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

Er möchte nur 2 login_date nicht alle –

+0

@jenish, Benutzer möglicherweise keine oder viele Datensätze in Login-Track-Tabelle. – orangetime

+0

Sie können die erforderliche Bedingung in where Bedingung für weitere Verbesserung dieser Abfrage @orangetime – Jenish

Verwandte Themen