Vinzenz Mai: Abfrage innerhalb einer Tabelle

Beitrag lesen

Hallo Dirk,

ich bin gerade erst in MYSQL eingestiegen  und habe keine Probleme mit verknüpften Tabellen. Für eine Website suche ich jetzt zu bestimmten Artnamen von Pflanzen und Tieren, die entsprechenden Angaben zu Gattung, Familie, Ordnung etc.. Es gibt ein taxonomisches Datenbank-System, dass die Infos zum download unter www.itis.usda.gov/ zur Verfügung stellt.

diese möchtest Du offensichtlich nur importieren und direkt verwenden

Leider ist mir dort aufgefallen, dass die Einträge nicht über verschiedende Tabellen verknüpft sind sondern alle in einer einzigen Tabelle enthalten sind.

Solche hierarchischen Beziehungen trifft man öfter. Für relationale Datenbankmanagementsysteme wie MySQL ist dies eine ungünstige Struktur.

Ein Beispiel könnte wie folgt aussehen: A = Art, G = Gattung, UF = Unterfamilie, F = Familie, UO = Unterordnung, O = Ordnung, K = Klasse.
Dabei fällt auf, dass die Verknüpfung von Art bis hin zur Klasse unterschiedlich lang sein können, d.h. bei einigen Gruppen fehlen die Angaben zu UF und UO, so dass man einmal 5 ein anders mal 6 oder eben 7 Infos abfragen muss.

Nun aber zur Tabelle:

id Name Verknüpfung Bezeichnung
1 A1 2 Art
2 G1 4 Gattung
3 A2 2 Art
4 F1 5 Familie
5 O1 6 Ordnung
6 K1  Klasse
7 A3 8 Art
8 G2 9 Gattung
9 UF1 10 Unterfamilie
10 F2 6 Familie

Als Ergebnis möchte ich gerne folgendes angezeigt haben:

Art A1
Gattung G1
Familie F1
Ordnung O1
Klasse K1

bzw.:
Art A3
Gattung G2
Unterfamilie UF1
Familie F2
Ordnung O1
Klasse K1

Hat jemand von Euch eine Idee wie ich die Abfrage gestalten und mit php generieren könnte.

_Die_ Abfrage gibt es nicht. Du musst die Tabelle rekursiv von der Art bis zur Klasse durchlaufen, d.h. eine Serie von Abfragen absetzen. Jetzt kommt meine Lieblingsfrage:

Welche Version von MySQL verwendest Du? Auch wenn das sukzessive Absetzen von Queries an die Datenbank nicht gerade effizient ist, so könntest Du, MySQL 5 und neuer vorausgesetzt, Dein Problem mit einer Stored Procedure lösen.

Eine Zerlegung der Tabelle in mehrere möchte ich unter allen Umständen vermeiden.

Warum? Für Deine Problemstellung bieten sich "Nested Sets" an. Ich vermute, dass sich die Änderungen im Vergleich zum Datenbestand in Grenzen halten.

Hier ein paar Archivpostings und -threads zu diesem Thema:

</archiv/2006/2/t123458/#m794964>
</archiv/2006/3/t125135/>
</archiv/2006/3/t125579/>
</archiv/2006/3/t126324/>

Freundliche Grüße

Vinzenz