SQL Bei doppelten Einträgen nur den mit größtem Wert in bestimmter Spalte wiedergeben

s0nny

Ensign
Registriert
März 2012
Beiträge
187
Operator !> verwenden

Hi,
ich habe gerade ein Problem mit einer SQL abfrage über PHP.
Ich habe folgende Tabelle (vereinfacht mit willkürlichen Daten):

Computer | Letzter Scan
_________|_________
computer1 | 01.01.2013 13:00:00
computer2 | 31.12.2012 13:00:00
computer3 | 30.12.2012 13:00:00
computer2 | 30.12.2012 13:00:00
computer2 | 29.12.2012 13:00:00
computer1 | 29.12.2012 13:00:00
computer3 | 29.12.2012 13:00:00
computer4 | 29.12.2012 13:00:00
computer4 | 28.12.2012 13:00:00

Nun will ich von Jedem PC nur den Eintrag mit dem aktuellsten Datum haben, soll dann also so aussehen:

Computer | Letzter Scan
_________|_________
computer1 | 01.01.2013 13:00:00
computer2 | 31.12.2012 13:00:00
computer3 | 30.12.2012 13:00:00
computer4 | 29.12.2012 13:00:00

Wie kann ich das denn bewerkstelligen? Hab schon einiges ausprobiert aber es kam nie das raus was ich wollte :(
 
Zuletzt bearbeitet:
Sortiere nach dem Datum, so dass du als erstes den aktuellen Zeitpunkt hast und anschließend noch mit GROUP BY das ganze anhand der PC auslesen.

Also die Funktionen ORDER BY und GROUP BY ansehen. Dann sollte es klappen :)
 
Irgend etwas der Kategorie select distinct Computer, max(Letzter Scan) from ...

Die genaue Syntax (für deinen SQL Typ) ergoogeln oder einfach im SQL Studio ausprobieren ;) Solche Queries sind bei mir auch immer Trial-And-Error, gerade wenn man mit unterschiedlichen SQL Dialekten arbeitet verhält sich jeder etwas anders.
 
Irgendwie krieg ich das trotzdem nicht so ganz. GROUP BY und ORDER BY in einer Abgrafe funktionieren nicht und wenn ich es mit SELECT DISTINCT kann ich mir lediglich die Liste der Rechnernamen anzeigen lassen, sobald ich die letzten Scans dazu haben will funktioniert es nicht mehr.
 
s0nny schrieb:
Irgendwie krieg ich das trotzdem nicht so ganz. GROUP BY und ORDER BY in einer Abgrafe funktionieren nicht und wenn ich es mit SELECT DISTINCT kann ich mir lediglich die Liste der Rechnernamen anzeigen lassen, sobald ich die letzten Scans dazu haben will funktioniert es nicht mehr.

Probiers doch mal hiermit. Wie meine Vorredner schon sagten, kann die Syntax leicht von Dialekt zu Dialekt variieren.

Code:
SELECT computer, max(scandatum) as letzter_scan
FROM tabelle
GROUP BY computer
ORDER BY computer
 
Operator !> verwenden

Ach habs, Dank euch ;-)
Ergänzung ()

Ist es denn möglich, bei einer SQL Anweisung den Operator !> (nicht größer als) zu verwenden? Ich weiß, dass das eigentlich auch nur "kleiner gleich" heißt, in meinem Fall würde es jedoch helfen.

Was ich genau will:
In der Tabelle werden alle Scans von allen Rechnern gespeichert. Ich möchte aus der Tabelle, alle die Rechner ausgeben, deren Virenscan länger als 1Monat zurückliegt (im Beispiel einfach mal 1.12.12 als Stichtag) und die in der Zeit auch online waren! Jeder Scan ergibt einen Eintrag in der Datenbank! Ein Rechner der also z.B. am 5.11.12 und am 3.12.12 gescant wurde, ist auch mit 2 Einträgen in der Datenbank zu finden. Dieser Rechner war also seit dem 1.12.12 online UND hat gescant (Startzeit = Startzeit des Scans).

Wenn ich jetzt schreibe:
Code:
SELECT 		Rechnername, max(Startzeit) AS Lastscan
FROM 		Tabelle
WHERE 		Last_Online_Time >= '01.12.2012 00:00:00'
AND 		Startzeit <= '01.12.2012 00:00:00'
GROUP BY	Rechnername
ORDER BY 	Rechnername

Würden auch dieser Rechner mit angezeigt, der im Dezember sowohl online war, als auch geprüft wurde, weil sowohl "Last_Online_Time >= 1.12.12", als auch "Startzeit <= 1.12.12" (weil ja der Scan vom 5.11.12 noch in der Datenbank gespeichert ist) True ergeben.

Wenn ich es jetzt aber so schreiben würde:
Code:
SELECT 		Rechnername, max(Startzeit) AS Lastscan
FROM 		Tabelle
WHERE 		Last_Online_Time >= '01.12.2012 00:00:00'
AND 		Startzeit !> '01.12.2012 00:00:00'
GROUP BY	Rechnername
ORDER BY 	Rechnername

Sollte der Rechner imho nicht mit angezeigt werden, da "Last_Online_Time >= 1.12.12" zwar True ergibt, "Startzeit !> 1.12.12" jedoch False ergeben müsste, da es ja einen Eintrag vom 3.12.12 gibt!

Geht das denn mit "!>" ? Bekomme nämlich dennoch alle PCs angezeigt die eigentlich den Scan im Dezember gemacht haben :(
 
Zuletzt bearbeitet:
AW: Operator !> verwenden

Ich hoffe, ich habe Dein Problem richtig verstanden.
Mir scheint, Du brauchst den letzten gespeicherten Scantermin pro Computer, der ab einem gewissen Tag online war und willst untersuchen, ob dieser Termin vor dem letzten Onlinetermin war?
Der Operator HAVING erlaubt es, Bedingungen nach der Gruppierung zu formulieren.

Code:
SELECT Rechnername, max(Startzeit) AS Lastscan
FROM Tabelle
WHERE Last_Online_Time >= '01.12.2012 00:00:00'
GROUP BY Rechnername
HAVING max(Startzeit) <= '01.12.2012 00:00:00'
ORDER BY Rechnername
 
Zurück
Oben