igorclauss.de open_in_new

SQL - Lücken in einer Liste von Zahlen finden

Einleitung

Vor einiger Zeit stieß ich beim Arbeiten an einer Website auf das Problem, dass ich herausfinden musste, ob eine indexierte Mysql Tabelle Lücken in den Indizes aufweißt. Bei kleinen Tabellen kein Problem, jedoch war diese Tabelle zu groß um dies mit bloßem Nachsehen zu lösen. Es musste ein SQL-Statement her, dass mir genau diese Lücken wiedergibt.

Beim Suchen nach einer Lösung landete ich bei dieser Fragestellung auf stackoverflow.com mit dem bezeichnenden Titel »How to find gaps in sequential numbering in mysql?«.

Darauf werden verschiedene Lösungsvorschläge aufgeführt. Allerdings hat sich für mich als bester Vorschlag folgender erwiesen, welcher in seiner Performanz und Allgemeingültigkeit hervorstach:

SELECT
CONCAT(z.expected, IF(z.got-1>z.expected, CONCAT(' thru ',z.got-1), '')) AS missing
FROM (
SELECT
  @rownum:=@rownum+1 AS expected,
  IF(@rownum=SPALTE, 0, @rownum:=SPALTE) AS got
FROM
  (SELECT @rownum:=0) AS a
  JOIN TABELLE
  ORDER BY SPALTE
) AS z
WHERE z.got!=0;

In diesem kleinen Meisterwerk müssen lediglich der Tabellenname und der Spaltenname ersetzt werden, dann gibt es die genauen Lücken der Liste zurück.

Einen Kommentar posten

Kommentare zu diesem Beitrag