Hallo Dennis,
da du das ergebnis eh auch einen datensatz beschränkst, kann man die abfrage auch umschreiben, indem man nach domain_id sortiert und die korrelierte unterabfrage wegläßt.
^^ Danke für deine Antwort. Kannst di mir diesen Teil aber bitte nochmal etwas ausführlicher erklären?
wieviele Datensätze erhältst Du durch den Einsatz von
LIMIT 1
?Oha, genau einen.
Genau aus diesem Zweck kannst Du die teure korrelierte Unterabfrage gleich weglassen. Sie filtert Dir nur Datensätze aus, die Du eh' nicht benötigst.Du bist an den Einträgen interessiert, die einen bestimmten ip-Wert ausweisen und deren scan_id den höchsten Wert zu diesem ip-Wert aufweist:
SELECT
COUNT(r.id), -- zähle die id-Werte
r.scan_id -- und gib mir die Werte der scan_id
FROM
results r
WHERE
r.ip = <wert> -- zu einer bestimmten ip
GROUP BY
r.scan_id -- gruppiert nach den scan_id-Werten
-- Anmerkung: manche DBMS wollen diese Spalte dann
-- auch in der Spaltenliste haben
ORDER BY
r.scan_id DESC -- absteigend sortiert nach der scan_id, so dass die
-- größte scan_id im ersten Datensatz steht
LIMIT 1 -- und gib mir nur den ersten Datensatz zurück.
>
> Dieses Statement versagt, sobald Du mehr als einen Datensatz haben willst.
>
>
> Freundliche Grüße
>
> Vinzenz
Hallo Vinzenz,
danke für deine Antwort.
Das Problem bei meiner Abfrage ist folgendes:
Ich habe eine Menge von Domains. Diese Domains haben 0,1 oder n IP Adressen zugeordnet. Die IP einer Domain kann wechseln. Gespeichert wird immer nur eine Änderung, d.h. die IP Adresse einer Domain ist anders.
Die Abfrage muss nicht nur die Anzahl der Domains pro IP Adresse zählen, sondern auch noch schauen, sondern auch Prüfen, ob es zu einer Domain mit einer IP Adresse nicht einen aktuelleren Eintrag mit einer anderen IP Adresse und höherer scan\_id gibt. Ist das so, so muss der Eintrag mit der kleineren scan\_id ja wieder aus der Ergebnismenge entfernt werden. Die Zuordung von Domain zu IP stimmt dann nämlich nicht mehr, da die Domain eine neue IP hat.
Gruß
Dennis