Eintrag-Details: Daten gruppieren und temporäre Tabellen in MySQL

26.01.2006

Daten gruppieren und temporäre Tabellen in MySQL

Neulich las ich eine Frage in einer mySQL Newsgroup. Hier fragte jemand, wie man aus einer Tabelle mit Personendaten diejenigen Leute herausfinden kann, die am ältesten sind und ein weiteres Kriterium (z.B. den gleichen Nachnamen) haben.

[Mehr:]

Anmerkung: Die hier vorgestellten Tabellen-Definitionen und Abfragen sollen lediglich das Prinzip verdeutlichen. Bei einigen Einzelheiten würde man in einer endgültigen Anwendung möglicherweise anders vorgehen. Sie dienen hier lediglich als Beispiele, damit das Verfahren anschaulich erläutert werden kann. In meinen Online-Kursen wird selbstverständlich genauer auf Einzelheiten eingegangen.

Advertisement/Werbung
Als Beispiel sei eine Tabelle mit folgendem Aufbau gegeben:

create table personen
(vorname varchar(80),
nachname varchar(80),
geburtsdatum datetime)

Code herunterladen

So eine Aufgabe ist mit mySQL gar nicht so trivial. Zunächst bietet sich natürlich erst mal eine Gruppierung nach dem passenden Kriterium (hier der Nachname) an. Also etwa so:

"select * from personen group by nachname"

Code herunterladen

Damit wären schon mal alle Datensätze auf der Kriterium "Nachname" reduziert. Leider bringt uns das der Lösung nicht näher, denn die Felder "vorname" und "geburtsdatum" erscheinen in der gruppierten Fassung nur zufällig. Hier wird noch eine Aggregatfunktion benötigt, um die jeweils älteste Person dieses Namens zu finden:

"select nachname, min(geburtsdatum) as datum
    from personen
    group by nachname"

Code herunterladen

Damit erscheinen nun alle Personen mit gleichem Namen, wobei die Funktion "min(geburtsdatum)" jeweils das kleinste Datum aus der Gruppe auswählt.

Damit wäre die Aufgabe wohl schon gelöst. Leider wissen wir immer noch nicht, welche Person genau gemeint ist, denn der Vorname erscheint noch nirgends im Ergebnis. Auch hier nutzt es nichts, den Vornamen in die Gruppen-Abfrage mit einzubringen, denn auch hier würde wieder nur ein zufälliger Name aus der gleichen Nachnamen-Gruppe erscheinen. Wir benötigen jedoch genau den Vornamen, der zum Nachnamen UND zum ermittelten Geburtsdatum passt.

Advertisement/Werbung
Leider kann mySQL bis zur Version 4.1 noch keine Sub-Selects ausführen, so dass man hier zum Hilfsmittel der temporären Tabelle greifen muss.

Eine temporäre Tabelle wird nur für die Dauer der einzelnen Datenbanksitzung angelegt. Sobald das PHP-Skript (also der Aufbau der Webseite) beendet ist, wird diese Tabelle sofort wieder gelöscht.

Außerdem vergibt mySQL intern immer einen eindeutigen Namen für diese temporären Tabellen, so dass es nicht zu Problemen kommen kann, wenn mehrere Benutzer gleichzeitig das Skript benutzen.

MySQL unterstützt temporäre Tabellen seit Version 3.23

Die endgültige Lösung sieht also so aus, dass zunächst das korrekte Datum in Verbindung mit dem Namen gesucht wird. Daraus wird eine temporäre Tabelle erzeugt:

"create temporary table temp_select
    select nachname, min(geburtsdatum) as datum
    from personen
    group by nachname"

Code herunterladen

Im zweiten Schritt muss nun diese temporäre Tabelle durch einen Join mit der ursprünglichen Tabelle verbunden werden:

"select personen.* from
    personen, temp_select
    where personen.nachname = temp_select.nachname
    and personen.geburtsdatum = temp_select.datum"

Code herunterladen

Das daraus resultierende Ergebnis sind schließlich die ältesten Personen mit gleichem Nachnamen aus der Tabelle.

Das beiliegende Skript "mysql_group.php" soll den gesamten Vorgang verdeutlichen. Es legt zunächst eine Tabelle mit dem Namen "personen" an. Die Tabelle wird vorher gelöscht, falls Sie schon in der Datenbank vorhanden ist. Die hier beschriebenen Schritte werden dann ausgeführt und die Zwischenergebnisse in einer Tabelle angezeigt. So kann man leicht nachvollziehen, was das Skript genau tut.

Hinweis: Diesen Text und die enthaltenen Beispielprogramme und Skripte dürfen Sie zum Erlernen der einzelnen Techniken und auch als Grundlage für Ihre eigenen Projekte auf eigene Gefahr kostenlos nutzen.

Bitte denken Sie daran, dass alle Texte und Quellcodes trotzdem urheberrechtlich geschützt sind. Eine direkte Weitergabe ist nur nach ausdrücklicher schriftlicher Genehmigung gestattet.

Permalink 26.01.2006 07:55:37, von Marian Email , 607 Wörter, 20712 mal angeschaut   German (DE) Kategorien: MySQL

Kommentare, Pingbacks:

Kommentar von: jt [Besucher]
Urheberschutz für ar****. Das ist genau das, was eine Weiterentwicklung behindert. Für Anfänger mag das ja nicht trivial sein, dieses Tutorial ist aber in einer knappen Stunde aus dem Kopf heruntergeschrieben und erzeugt. Dieses Basiswissen dann auch noch betont unter Urheberrecht zu stellen ist für mich ein Ausdruck übertriebener Egomanie.
Permalink 18.02.2007 @ 10:02
Kommentar von: BlackRAt [Besucher]
@ jt
Man kann sich auch wirklich über alles aufregen oder?
Permalink 23.02.2007 @ 14:21

Werbung

Online-Kurse

  • Bequem PHP lernen bei freier Zeiteinteilung von zuhause
  • Der Onlinekurs den jeder versteht
  • www.lernpilot.de/wbt/

Konnte ich helfen?

mehr Werbung