2016-04-19 10 views
2

Ich versuche, das neueste Zertifikat einen Benutzer aus der Datenbank hat. Ich möchte nur das Neueste sehen und nicht alle anderen, also verwende ich group by und sortiere dann nach der eindeutigen ID aus der Haupttabelle.Verwenden von Gruppierung und Reihenfolge von in mysql Abfrage korrekt

Ohne Gruppe funktioniert das perfekt. Ich sehe das letzte hochgeladene Zertifikat und dann alle anderen unten.

Sobald ich die Gruppe hinzufügen, sehe ich das erste jemals hochgeladene Zertifikat, das sinnlos ist, wie es vor Jahren sein könnte.

Meine Abfrage ist ziemlich groß, da ich eine Menge anderer Informationen von anderen Tabellen zeichne.

Hier ist meine Abfrage.

SELECT 
     usercert.*, 
     cert.*, 
     certCat.certCatName, 
     certTask.certTaskName , 
     certStatus.certStatusName 
    FROM 
     `usercert` 
    INNER JOIN 
     cert 
    ON 
     cert.idcert = usercert.idcert 
    INNER JOIN 
     certCat 
    ON 
     certCat.idcertCat = cert.idcertCat 
    INNER JOIN 
     certTask 
    ON 
     certTask.idcertTask = usercert.idcertTask 
    INNER JOIN 
     certStatus 
    ON 
     certStatus.idcertStatus = usercert.idcertStatus 
    WHERE 
     usercert.iduser=%s 
    GROUP BY 
     usercert.idcert 
    ORDER BY 
     usercert.usercertEnd DESC 
+0

Haben Sie das Schlüsselwort 'MAX' für das Datum in Kombination mit dem Schlüsselwort' LIMIT' versucht? –

+0

Wenn Sie nur das letzte Zertifikat benötigen, benötigen Sie keine Gruppe nach. Mach einfach ein LIMIT 1 mit der bereits vorhandenen Anfrage und es sollte nur die Zeile zurückgeben, die du brauchst. –

Antwort

2
SELECT 
    usercert.*, 
    cert.*, 
    certCat.certCatName, 
    certTask.certTaskName , 
    certStatus.certStatusName 
FROM 
    `usercert` 
INNER JOIN 
    cert 
ON 
    cert.idcert = usercert.idcert 
INNER JOIN 
    certCat 
ON 
    certCat.idcertCat = cert.idcertCat 
INNER JOIN 
    certTask 
ON 
    certTask.idcertTask = usercert.idcertTask 
INNER JOIN 
    certStatus 
ON 
    certStatus.idcertStatus = usercert.idcertSttus 
WHERE 
    usercert.iduser=%s 
ORDER BY 
    usercert.usercertEnd 
DESC limit 0,1 

in dieser Abfrage es dauern wird, alle Rekord in absteigender Reihenfolge bedeutet dies die letzte eingefügt Zeile wird zuerst kommen und der Grenzwert 0, 1 bedeutet, dass es von 0 beginnt und 1 Datensatz holt 's it ...

+0

Das ist perfekt Vicky funktioniert wie ein Zauber, danke. Macht es Ihnen etwas aus, mir kurz zu erklären, was das am Ende macht? –

+1

nur eine Sekunde aktualisiert meine Antwort –

1

können Sie entweder MAX():

SELECT ... FROM ... WHERE ... ORDER BY MAX(usercert.usercertEnd) 

Oder LIMIT:

SELECT ... FROM ... WHERE ... ORDER BY usercert.usercertEnd DESC LIMIT 1 
Verwandte Themen