Ankündigung

Einklappen
Keine Ankündigung bisher.

Ausgabe aus mehreren Tabellen zusammensetzen

Einklappen

Neue Werbung 2019

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

  • Ausgabe aus mehreren Tabellen zusammensetzen

    Hallo allerseits,
    ich bin in dem Thema MySql ganz neu.
    Als .Net Programmierer habe ich bisher alles mit Xml gelöst.
    Bei meinem aktuellen projekt benötige ich aber eine DB.

    Daher habe ich jetzt mal etwas dazu gelesen, mir Xampp installiert und meine bestehende xml als MySqlDb erstellt.
    Wenn ich das mit dem Normalisieren richtig verstanden habe, sollte das auch alles passen.
    Jetzt habe ich aber einige Tabellen und würde gerne erstmal aus allen Tabellen wieder etwas brauchbares erstellen.
    Wie gesagt wurde bisher einfach eine xml eingelesen.
    Ich möchte also gerne alle Tabellen wieder als einen Part ausgeben. (z.b Json)

    Lange Rede, gar kein Sinn.

    Kurzes Beispiel.

    Tabelle "Personen"
    id name vorname
    0 Papa mein
    1 Mama meine

    Tabelle "Obst"
    id name
    0 Apfel
    1 Birne

    Tabelle "Gemüse"
    id name
    0 Gurke
    1 Salat

    Tabelle "Essen"
    p_id o_id g_id
    0 1 0
    1 0 NULL
    1 1 NULL

    Wie kann ich jetzt eine Abfrage/Ausgabe erstellen, für alle Personen und was sie so alles essen. Und das ganze eben so, das nicht die Obst oder Gemüse id angezeigt werden sondern deren werte?

    PHP-Code:
    $db_erg mysqli_query$db_link"SELECT * FROM Personen");
         while (
    $zeile mysqli_fetch_array$db_ergMYSQL_ASSOC))
        {        
              
    // Hier starte ich gerade mit $zeile['id'] die Select zu den restlichen Tabellen
            

    Im Original erstellt die Schleife ein array welches als Json ausgegeben wird.
    Das ganze funktioniert ja auch, nur dauert es schon bei ca 20000 Datensätzen fast 2 Minuten.

    Wenn mir jemand einen Tipp geben kann, wie ich dies im Beispiel richtig lösen, werde ich den Rest vermutlich selber erarbeiten können.
    Nur fehlt mir gerade der entscheidende Hinweis.

    Danke
    Dierk


  • #2
    join. Sollte sich in jedem SQL-Tutorial finden lassen.
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Zitat von nikosch Beitrag anzeigen
      join. Sollte sich in jedem SQL-Tutorial finden lassen.
      Join wurde ja schon genannt.

      Code:
      test=*# select * from personen ;
       id | name | vorname            
      ----+------+---------           
        1 | Papa | mein               
        2 | Mama | meine
      (2 rows)
      
      Time: 0,220 ms
      test=*# select * from obst ;
       id | name
      ----+-------
        1 | Apfel
        2 | Birne
      (2 rows)
      
      Time: 0,174 ms
      test=*# select * from gemuese ;
       id | name
      ----+-------
        1 | Gurke
        2 | Salat
      (2 rows)
      
      Time: 0,174 ms
      test=*# select * from essen ;
       id_p | id_o | id_g
      ------+------+------
          1 |    2 |    1
          2 |    1 |
          2 |    2 |
      (3 rows)
      
      Time: 0,173 ms
      test=*# select p.name, p.vorname, o.name, g.name from essen e left join personen p on e.id_p = p.id leftjoin obst o on e.id_o=o.id left join gemuese g on e.id_g = g.id;
       name | vorname | name  | name
      ------+---------+-------+-------
       Papa | mein    | Birne | Gurke
       Mama | meine   | Apfel |
       Mama | meine   | Birne |
      (3 rows)
      Nun hast aber 2 Zeilen für die Mama. Das willst ja sicher zusammengefaßt haben.
      Also aggregiert man dies:

      Code:
      test=*# select p.name, p.vorname, array_agg(o.name) as obst, array_agg(g.name) as gemuese from essen e left join personen p on e.id_p = p.id left join obst o on e.id_o=o.id left join gemuese g on e.id_g = g.idgroup by p.name, p.vorname;
       name | vorname |     obst      |   gemuese
      ------+---------+---------------+-------------
       Mama | meine   | {Apfel,Birne} | {NULL,NULL}
       Papa | mein    | {Birne}       | {Gurke}
      (2 rows)
      Nun willst Du aber das ja eigentlich dann als JSON haben. Wäre doch cool, wenn das gleich die DB macht, oder?

      Code:
      test=*# select row_to_json(foo) from (select p.name, p.vorname, array_agg(o.name) as obst, array_agg(g.name) as gemuese from essen e left join personen p on e.id_p = p.id left join obst o on e.id_o=o.id left join gemuese g on e.id_g = g.id group by p.name, p.vorname) foo;
                                         row_to_json
      ----------------------------------------------------------------------------------
       {"name":"Mama","vorname":"meine","obst":["Apfel","Birne"],"gemuese":[null,null]}
       {"name":"Papa","vorname":"mein","obst":["Birne"],"gemuese":["Gurke"]}
      (2 rows)
      oder

      Code:
      test=*# select row_to_json(foo) from (select p.name, p.vorname, array_to_string(array_agg(o.name),',') as obst, array_to_string(array_agg(g.name),',') as gemuese from essen e left join personen p on e.id_p = p.id left join obst o on e.id_o=o.id left join gemuese g on e.id_g = g.id group by p.name, p.vorname) foo;
                                   row_to_json
      ---------------------------------------------------------------------
       {"name":"Mama","vorname":"meine","obst":"Apfel,Birne","gemuese":""}
       {"name":"Papa","vorname":"mein","obst":"Birne","gemuese":"Gurke"}
      (2 rows)

      Und schon hast alles als JSON.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar


      • #4
        Danke euch beiden erstmal.
        Werde mir das später mal genauer ansehen.
        Das Beispiel von akretschmer wird mir aber sicher helfen.

        Kommentar

        Lädt...
        X