4 Stimmen

Rekursive Datenbankaufrufe in Perl

Ich weiß, dass es einen einfachen Weg gibt, dies zu tun, aber meine Rekursionsfähigkeiten sind aus der Übung. Gegeben eine Datenbanktabelle, die drei Felder hat:

id
label
child_id

Ich sollte in der Lage sein, eine rekursive Funktion zu erstellen, die eine Ausgabe wie diese ergibt:

child (input of program)
  parent1
  parent2
    grandparent1
      great-grandparent1
    grandparent2
    grandparent3
  parent3
    grandparent4
    grandparent5

Ich weiß, dass es einfach sein sollte, aber ich kann meinen Verstand nicht dazu bringen, die mentale Gymnastik zu vollziehen, damit es funktioniert. Ist das überhaupt eine gute Idee? Es sieht so aus, als ob ich am Ende eine ganze Reihe von Datenbankverbindungen offen lassen könnte.

Ich glaube, das ist der Teil, der es mir schwer macht. Ich fange mit einem child_id an und arbeite mich nach oben. Und ein Kind kann viele Eltern haben. Die Ausgabe wäre also die Kind-ID an der "Wurzel" des Baums und dann die Eltern und Großeltern für jeden Zweig. Je mehr ich darüber nachdenke, ist es einfach die traditionelle Formel "ein Elternteil, viele Großeltern", außer für die Semantik. Vielleicht denke ich aber auch nur zu viel darüber nach.

Die Tabelle würde etwa so aussehen:

table parents

id    child_id    label
 1     NULL       child
 2     1          parent1
 3     1          parent2
 4     1          parent3
 5     3          grandparent1
 6     3          grandparent2
 7     3          grandparent3
 8     5          great-grandparent1
 9     4          grandparent4
10     4          grandparent5

3voto

Toto Punkte 85935

So können Sie es versuchen

sub getChildren {
  my $id = shift;
  my $depth = shift;
  my $sql = qq/SELECT id,label,child_id FROM table WHERE id=?/;
  my $sth = $db->prepare($sql);
  my $sth->execute($id);
  while(my ($id,$label,$child_id)=$sth->fetchrow_array) {
    print " "x$depth,$label;
    getChildren($child_id,$depth++);
 }
}
getChildren($id);

0voto

Robin Smidsrød Punkte 447

Ich habe in meinem Blog ein ganz ähnliches Problem beschrieben, Implementierung einer Tiefensuche in einer PostgreSQL Stored Procedure und meine Art, dieses Problem mit Perl zu lösen.

Wenn Ihre Datenbank keine gespeicherten Prozeduren unterstützt, können Sie das Gleiche auf der Client-Seite tun, aber Sie müssen zuerst die gesamte Tabelle abrufen und dies im Speicher tun.

Sie könnten natürlich rekursiv vorgehen und jeden Eintrag nach und nach abrufen, aber das ist wegen des Overheads der SQL-Anweisungen nicht skalierbar (außer vielleicht bei SQLite). Wenn die Leistung kein Problem darstellt, ist dies die bei weitem einfachste Lösung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X