Vinzenz Mai: SQL Abfrage - Index setzen

Beitrag lesen

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