Ankündigung

Einklappen
Keine Ankündigung bisher.

Mysql Datenbank als Hierarchie ausgeben

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mysql Datenbank als Hierarchie ausgeben

    Hey Leute,

    Ich habe folgende Frage...

    Momentan Arbeite ich daran, dass meine Website einzelne Datensätze mit deren Untergruppen (-->Hierarchie) aus meiner Datenbank ausgeben kann.
    Leider weiß ich nicht wie die Untergruppen mit dem richtigen Datensätze ausgegeben werden.
    Das ganze soll eigentlich unabhängig von der .php Datei sein und durch die Tabelle frei veränderbar sein.
    Meine Tabelle sieht vom Aufbau so aus:
    Tabelle:
    ID Name Hierarchie ParentID
    1 Titel1 1 0
    2 Titel2 1 0
    3 Untertitel von 1 2 1
    4 Untertitel von 3 3 3
    Hier mein Beispiel...

    index.php:
    PHP-Code:

                          <?php

                    $verbindung 
    mysqli_connect("localhost","username","password""database");

                    if (
    mysqli_connect_errno()) {
                        
    printf("Connect failed: %s\n"mysqli_connect_error());
                        exit();
                    }

                    
    error_reporting(E_ALL);
                    
    ini_set("display_errors"1);

                    if(!isset(
    $_POST['such'])) { /*Fehler, Ende*/ }

                    
    $sql "SELECT * FROM Tabelle WHERE Hierarchie = '1'";
                    
    $result mysqli_query($verbindung$sql);


                    while (
    $row mysqli_fetch_assoc($result))
                    {
                    echo 
    '<li> <a href="uebergabe.php">' .$row['Name'].'</a></li><br><br>';

                    }
                    
    mysqli_close($verbindung);

                    
    ?>
    Soweit ja so gut aber ich weiß nicht wie ich nun die uebergabe.php machen soll bzw. sollte nun auf der uebergabe.php nur der angeklickte Titel (Bsp. Titel1) und seine Untergruppen angezeigt werden.

    Könnte mir jemand helfen?

    Danke schon mal im Voraus

    LG skipper114b

  • #2
    Nicht direkt möglich mit Vanilla MySQL.
    Du kannst die Daten ziehen und in PHP dann eine Struktur draus machen (Stichwort: Rekursion).
    Möglicherweise könnten dir noch Nested Sets (Google) dabei helfen, die Daten vorzusortieren. Meiner Meinung nach, solltest du Nestet Sets nur einsetzen, wenn du dazu gezwungen bist. Ansonsten war es das auch soweit.
    Andere Datenbanken wie PostgreSQL) sind da etwas freundlicher.

    Kommentar


    • #3
      Zitat von rkr Beitrag anzeigen
      Andere Datenbanken wie PostgreSQL) sind da etwas freundlicher.
      ACK. Rekursive Abfragen wurden in 8.4 eingeführt, das kam im Juli 2009 raus und ist seit Juli 2014 schon nicht mehr supportet. Die nächste MySQL/MariaDB-Version bringt wohl ansatzweise WITH-Syntax mit, aber ich weiß nicht, ob auch recursive.

      Du kannst das natürlich mit der Rekursion in PHP nachbilden - die Performance dürfte grottig sein. Alternativ: PostgreSQL - mit 9.6 auch z.B. mit "parallel Query Execution"
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Um es mal kurz zu zeigen...

        Code:
        test=*# select * from skipper ;
         id |       name       | parent_id
        ----+------------------+-----------
          1 | Titel1           |          
          2 | Titel2           |          
          3 | Untertitel von 1 |         1
          4 | Untertitel von 3 |         3
        (4 Zeilen)
        Deine Spalte Hierachie ist unnötig weil berechenbar.

        Code:
        test=*# with recursive r as (
          select
            *
            , 0::int as level
            , name as titel_hierachie
          from skipper
          where parent_id is null
          union all
          select
            s.*
            , r.level+1
            , r.titel_hierachie || ' -> ' || s.name
          from skipper s
            inner join r on (s.parent_id=r.id)
        )
        select * from r;
         id |       name       | parent_id | level |                titel_hierachie                 
        ----+------------------+-----------+-------+------------------------------------------------
          1 | Titel1           |           |     0 | Titel1
          2 | Titel2           |           |     0 | Titel2
          3 | Untertitel von 1 |         1 |     1 | Titel1 -> Untertitel von 1
          4 | Untertitel von 3 |         3 |     2 | Titel1 -> Untertitel von 1 -> Untertitel von 3
        (4 Zeilen)
        
        test=*#

        Alles was unterhalb parent_id = 1 ist:

        Code:
        test=*# with recursive r as (
          select
            *
            , 0::int as level
            , name as titel_hierachie
          from skipper
          where parent_id = 1
          union all
          select
            s.*
            , r.level+1
            , r.titel_hierachie || ' -> ' || s.name
          from skipper s
            inner join r on (s.parent_id=r.id)
        )
        select * from r;
         id |       name       | parent_id | level |           titel_hierachie            
        ----+------------------+-----------+-------+--------------------------------------
          3 | Untertitel von 1 |         1 |     0 | Untertitel von 1
          4 | Untertitel von 3 |         3 |     1 | Untertitel von 1 -> Untertitel von 3
        (2 Zeilen)
        
        test=*#
        oder alles unterhalb einer id, z.B. id=1:

        Code:
        test=*# with recursive r as (
          select
            *
            , 0::int as level
            , name as titel_hierachie
          from skipper
          where id = 1
          union all
          select
            s.*
            , r.level+1
            , r.titel_hierachie || ' -> ' || s.name
          from skipper s
            inner join r on (s.parent_id=r.id)
        )
        select * from r;
         id |       name       | parent_id | level |                titel_hierachie                 
        ----+------------------+-----------+-------+------------------------------------------------
          1 | Titel1           |           |     0 | Titel1
          3 | Untertitel von 1 |         1 |     1 | Titel1 -> Untertitel von 1
          4 | Untertitel von 3 |         3 |     2 | Titel1 -> Untertitel von 1 -> Untertitel von 3
        (3 Zeilen)
        
        test=*#
        Das bekommst in dieser Eleganz (nur ein Select an die DB) nicht mit PHP hin.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Schau dir auch mal an was alles so unter dem Begriff "Adjacency list" zu finden ist.
          Deine gezeigte Struktur deutet darauf hin, das es womöglich das ist was du suchst.
          Dafür gibt es auch Lösungen für MySQL und ist relativ einfach zu händeln.
          s.a. Beitrag Mehrere Kommentarebenen.

          Kommentar


          • #6
            Eventuell kommt hier auch Nested Sets als Speicherung des Baumes in der Datenbank in Frage, anstatt über parent ids. Ist halt die Frage, was mit solch einem Baum gemacht werden soll. Wenn Du das per parent ids speicherst sind halt Ausgaben des Baumes sehr unperformant, da das rekursiv gemacht werden muss. Dafür ist das Verändern des Baumes (Einfügen/Entfernen von Knoten) recht performant. Bei Nested Sets ist es quasi genau andersherum. Hier ist die Darstellung des Baumes sehr performent (benötigt nur einen SQL Befehl), dafür ist das Bearbeiten des Baumes hingegen wieder teuer. Also, wie gesagt, kommt immer darauf an, was das "Einsatzgebiet" eines solchen Baumes ist.
            There are 10 kind of people: those who understand binary and those who don't.

            Kommentar

            Lädt...
            X