Rekursive Abstammung [SQL|PHP]

Falls du mal nen tollen Code entwickelst, hier ist der Platz ihn zu teilen

Moderator: Nanni

Benutzeravatar
Smaho
Beiträge: 178
Wohnort: Dänemark
Kontaktdaten:

Rekursive Abstammung [SQL|PHP]

Beitragvon Smaho » Fr 23. Dez 2016, 09:19

Hallöchen

ich dachte vielleicht kann mir ja hier jemand auf die Sprünge helfen.
Ich habe vor einiger Zeit schon mal versucht die Abstammung rekursiv (also sich selber aufrufend) abzufragen, aber die Performance war so grausig, dass ich das jetzt doch über JOINS laufen lassen. Allerdings finde ich das schade, weil ich so keine dynamische Generationsabfrage haben kann... also ich muss immer noch manuell festlegen, wie viele Generationen abgefragt werden sollen und habe für jede Verwandschaft eine eigene Abfrage. Was natürlich ... nun ja, nervig ist :lol:

Einen Versuch hatten wir damals über eine Funktion

Code: Alles auswählen

function holen($name, $generation)
{
         
        if($generation != 4)
       {         
        $generation++;
        $sql = "SELECT  * FROM dat WHERE id = '$id'";
    $result = mysql_query($sql);
        $pferd=mysql_fetch_array($result);
        $vater = $pferd[vater]; 
        $mutter = $pferd[mutter];
        echo "$pferd[name]<br>";
        {
                     holen($vater,$generation); 
             holen($mutter,$generation);
                } 
        }
 } 


Aber ... nun ja, es ist nicht das goldene vom Ei, besonders da ich teilweise nicht ID sondern Name gespeichert ist... :roll:
Also ... wer Ideen hat, immer her damit :lol:

Kommen wir zu dem goldenen Ei, das auch alles bestimmt superduperklasse ist ... aber ... :rofl ich habe keine Ahnung, wie ich das korrekt anzeigen lassen kann? Außer alles nacheinander :rofl

Code: Alles auswählen

<?php

namespace whatever;

use PDO;

class Horse
{
    public $id;
    public $name;
    public $father;
    public $mother;

    public function __construct($id, $name, $vater = null, $mutter = null)
    {
        $this->id     = $id;
        $this->name   = $name;
        $this->vater = $vater;
        $this->mutter = $mutter;
    }
}

function getHorseWithAncestors(PDO $pdo, $horseId, $maxGenerations = 5)
{
    $statement = $pdo->prepare("SELECT * FROM `register_pferde` WHERE `id` = :id");

    $rec = function ($horseId, $generation) use ($statement, &$rec, $maxGenerations) {
        $statement->execute(array(':id' => $horseId));
        $data = $statement->fetch();
        $horse = new Horse($data['id'], $data['name']);

        if ($generation < $maxGenerations) {
            if ($data['vater'] !== null) {
                $horse->vater = $rec($data['vater'], $generation + 1);
            }

            if ($data['mutter'] !== null) {
                $horse->mutter = $rec($data['mutter'], $generation + 1);
            }
        }

        return $horse;
    };

    $horse = $rec($horseId, 0);

    return $horse;
}

function render(Horse $horse)
{
    $rec = function (Horse $horse, $indentLevel) use (&$rec) {
        $spacer  = str_repeat(" ", $indentLevel);
        $spacer2 = str_repeat(' ', $indentLevel + 1);
         $s = $spacer . $horse->name . "";

        if ($horse->vater !== null) {
            $s .= $rec($horse->vater, $indentLevel + 1);
        } else {
            $s .= $spacer2 . ' ' . "";
        }

        if ($horse->mutter !== null) {
            $s .= $rec($horse->mutter, $indentLevel + 1);
        } else {
            $s .= $spacer2 . ' ' . "";
        }

        return $s;
    };

    return $rec($horse, 0);
}



error_reporting(-1);
ini_set('display_errors', 1);

$pdo = new PDO(
    'mysql:dbname=db;host=localhost',
    'nutzer',
    'passwort',
    array(
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"
    )
);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

$horse = getHorseWithAncestors($pdo, $id, 2);

echo render($horse);

?>
Benutzeravatar
Romy
Beiträge: 34

Re: Rekursive Abstammung [SQL|PHP]

Beitragvon Romy » Fr 23. Dez 2016, 11:01

Könntest du vielleicht zusätzlich dein Datenbankschema posten? Das wäre hilfreich ;-)
Benutzeravatar
Smaho
Beiträge: 178
Wohnort: Dänemark
Kontaktdaten:

Re: Rekursive Abstammung [SQL|PHP]

Beitragvon Smaho » Fr 23. Dez 2016, 14:20

:lol: dann wirds lang

Die Daten stehen in `register_pferde`, wobei vater und mutter als ID hinterlegt sind, sofern sie einen Eintrag in `register_pferde` haben. Ansonsten steht halt der Name drin.
Benutzeravatar
Smaho
Beiträge: 178
Wohnort: Dänemark
Kontaktdaten:

Re: Rekursive Abstammung [SQL|PHP]

Beitragvon Smaho » Fr 23. Dez 2016, 14:28

Meinen "Erfolg" oder "Nicht-Erfolg" kann man im Übrigen hier verfolgen
http://moorwiesen.de/springstall/?id=st ... &pid=23220

Eigentlich soll er ganz unten bei der Abstammung entsprechend 2 Generationen anzeigen (also auch die Großeltern) und die Rasse des Pferdes und der Eltern :lol:
Benutzeravatar
Smaho
Beiträge: 178
Wohnort: Dänemark
Kontaktdaten:

Re: Rekursive Abstammung [SQL|PHP]

Beitragvon Smaho » So 25. Dez 2016, 18:56

Ok, für alle, die mitgefiebert haben :Rofl
Ich habe es hinbekommen und das Meisterwerk ist zu betrachten unter dem obigen Link.
Wer den Code dazu sehen will, kann sich gerne melden

Zurück zu „Codes“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast