2012-04-08 2 views
2

Ich habe zwei Tabellen Benutzer und Protokoll. Ich möchte der Benutzertabelle mit Protokollen beitreten und den letzten Protokolleintrag erhalten. Ich habe festgestellt, dass die Verwendung der Gruppe durch die Zeilen innerhalb der Gruppe nicht sortiert ist. Daher kann ich die letzte Protokollzeile nicht abrufen.Sqlite sortierte Zeilen innerhalb der Gruppe von

USER:

ID | Name 
-------------------- 
    1 | John  
    2 | Mike  

LOG:

L_ID | ACTION | DATE  | USERID 
---------------------------------- 
1 | OPEN | '1 DEC' | 1 
2 | CLOSE | '3 DEC' | 1 
3 | WRITE | '2 DEC' | 1 
4 | OPEN | '5 DEC' | 2 
5 | CLOSE | '3 DEC' | 2 

Mit dieser Tabelle haben das Ergebnis Ich mag würde, ist:

2 Mike 4 OPEN '5 DEC' 
1 Jhon 2 CLOSE '3 DEC' 

Ich weiß, dass die folgende Abfrage nicht funktioniert Da die Zeilen in der Gruppe nicht sortiert sind:

Select * from user join log on ID=USERID group by ID order by DATE DESC,L_ID 

Auch die folgenden nicht da arbeiten nur das richtige Datum, aber nicht die Aktionen zurückgegeben:

Select ID,Name,Action,Max(Date) from user join log on ID=USERID group by ID order by DATE DESC, L_ID 

Jede Idee Vorschlag, wie die Abfrage zu schreiben, die das richtige Ergebnis zurück?

+1

, was das Ergebnis sein wird, wenn zwei Aktion für Benutzer-ID 1 hat dasselbe Datum? – hkutluay

+0

@hkutluay Sie haben Recht Tabelle Protokoll hat auch eine ID nach Datum, ID wird zum Sortieren verwendet –

Antwort

0

Das ist ziemlich einfach:

SELECT u.*, l.* 
FROM user AS u 
INNER JOIN log AS l ON l.USERID=u.ID 
WHERE l.DATE = (SELECT max(DATE) FROM log WHERE l.USERID=u.ID ORDER BY L_ID DESC LIMIT 1) 

2 Mike 4 OPEN '5 DEC' 
1 Jhon 2 CLOSE '3 DEC' 

Diese in MySQL arbeiten sollte, damit SQLite hoffentlich auch .. Dies ist vielleicht die beste nicht optimiert sein, ich hoffe, die genaue Abfrage jemand mehr Wissen zu sehen geben.

Dies setzt voraus, dass das Datumsfeld ein korrektes Datumsfeld und keine Zeichenfolgen ist. Diese linksmight geben Ihnen etwas mehr Idee.

Bitte beachten Sie auch, dass Bestellung per ID ist nicht sicher, es muss nicht immer zuerst aufzeichnen, kleinere ID .. es kommt darauf an. So haben Sie immer eine sichere zweite Sortierspalte, etwas wie Gewicht oder so, das für "Zeit" oder Ihren eigenen kundenspezifischen Rang steht.

1

Alternativ habe ich auch eine Lösung für das Problem gefunden, aber wahrscheinlich ist meine Lösung "riskant", da sie auf einer nicht dokumentierten Annahme beruht. Ich habe bemerkt, dass die Gruppe die letzte Zeile der Gruppe als Referenzzeile verwendet. Also, was ich tat, ist die Abfrage in 2 und stellen Sie sicher, um die Zeile zu spalten I Gruppe verwiesen werden soll, indem der neueste einer der ersten Abfrage ist:

Select * from (
       Select * from user join log on ID=USERID order by DATE,L_ID 
      ) 
     group by ID order by DATE DESC