2017-08-25 1 views
0

Ich muss alle Mitarbeiter zuerst Login-Zeit und letzte Logout-Zeit innerhalb des Datumsbereichs finden. Bisher habe ich versucht, anderen Ansatz mit einer Gruppe von Klausel aber nicht in der Lage zu bekommen, was ich will ich versuchte, diese AbfrageMySQL - Alle Mitarbeiter zuerst Punch-in-Zeit und Last-Punch-in-Zeit innerhalb von Datumsbereich

SELECT p1.EmpName, p1.LogDate, 
      (SELECT MIN(LogTime) 
    FROM log as p2 
    WHERE p2.EmpName=p1.EmpName 
GROUP BY p2.EmpName) as login, 
      (SELECT MAX(LogTime) 
      FROM log as p2 
      WHERE p2.EmpName=p1.EmpName 
     GROUP BY p2.EmpName) as logout, 
        LogID from log as p1 
      WHERE LogDate 
      BETWEEN '2017-08-05 00:00:00' 
       AND '2017-08-010 00:00:00' 
     GROUP BY SrNo 

ich erreicht, was ich suchte Aber das gibt ich Ergebnisse duplizieren. Hier aktuelle Tabelle der log enter image description here

Hier ist, was ich erreicht habe bisher enter image description here

ich das gleiche Ergebnis wie 2. Bild wollen, aber ohne dupliziert Reihen. Ich habe festgestellt, dass OVER & PARTITION in MySQL nicht verfügbar ist, was es schwieriger macht. Ich bin nicht gut mit Selfjoins.

+0

Haben Sie versucht, distinct' Funktion mysql 'zu benutzen? Dies wird für Duplikate helfen und wird nur eine – Noob

+0

Wenn ich es auf EmpName column mit DISTINCT verwenden als Es entfernt die Zeilen von anderen Datum (gleiche EmpName) sowie gut und gibt mir Zeile für ein bestimmtes Datum. –

+0

In diesem Fall können Sie zur Gruppe von in Kombination von Reihenfolge von – Noob

Antwort

1

Sie können Ihre Anfrage in eine andere SELECT wickeln und eine GROUP BY auf sie anzuwenden, z.B .:

SELECT a.EmpName, a.LogDate, a.login, a.logout, a.logID 
FROM (
    SELECT p1.EmpName, p1.LogDate, 
    (SELECT MIN(LogTime) FROM log as p2 WHERE p2.EmpName=p1.EmpName Group by p2.EmpName) as login, 
    (SELECT MAX(LogTime) FROM log as p2 WHERE p2.EmpName=p1.EmpName Group by p2.EmpName) as logout, LogID 
    FROM log as p1 WHERE LogDate Between '2017-08-05 00:00:00' AND '2017-08-010 
    00:00:00' group by SrNo 
) a 
GROUP BY a.EmpName, a.LogDate, a.login, a.logout, a.logID 
+0

Was ist mit Leistung? –

+0

4 Select-Anweisung zusammen mit 4 Gruppe von dauert viel Zeit für die Ausführung unter Berücksichtigung von 400 Mitarbeitern. –

+0

Es gibt mehr als 400 Zeilen, sollte also in Ordnung sein. –

Verwandte Themen