Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Frage zu SQL Abfrage - Familie hinter allen Personen ausgeben

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Frage zu SQL Abfrage - Familie hinter allen Personen ausgeben

    Hallo,
    ich habe folgende SQL Datenbank mit zwei Tabellen:

    Personen:
    Pers_ID (automatisch)
    Name
    Vorname

    Familie:
    Fam_ID (automatisch)
    Fam_Nr
    Pers_ID

    In Personen sind alle Menschen folgendermaßen gespeichert:
    1 Peters Karl
    2 Mustermann Max
    3 Mustermann Erika
    4 Peters Karla
    5 Mustermann Hanna

    Jeder Person wird in Familie einer Familie zugeordnet über die Fam_Nr (Fam_ID ist nur eine laufende Nummer):
    Fam_ID-----Fam_Nr-------Pers_ID
    1--------------1--------------1
    2--------------2--------------2
    3--------------1--------------4
    4--------------2--------------5
    5--------------2--------------3

    Nun möchte ich alle Familienmitglieder (also mit gleicher Fam_Nr) hinter der Person ausgeben. DIe Anzahl der Familienmitglieder kann variieren:
    1 Peters--------Karl-------Karla
    2 Mustermann---Max------Erika-----Hanna
    3 Mustermann---Erika-----Max------Hanna
    4 Peters--------Karla-----Karl
    5 Mustermann---Hanna----Max------Erika

    Leider weiß ich nicht so recht wie ich die SQL Abfrage hierfür formulieren muss. (Die Datenbank habe ich nicht entworfen, ich hätte das ggf. anders aufgebaut) Ich hoffe jemand kann mir dabei helfen

    Vielen Dank für eure Hilfe!


  • #2
    Was heißt denn "hinter"? Für jedes Mitglied nochmal ne extra Spalte im Ergebnis?

    Die Datenbankstruktur stimmt so, der Spaltenname Fam_ID ist nur n bisschen irreführend.

    Hast du nen Ansatz für deine Abfrage?

    Btw, MySQL?
    Relax, you're doing fine.
    RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

    Kommentar


    • #3
      Fam_ID ist wirklich irreführend, müsste aber eigentlich auch nicht für die Abfrage relevant sein, habe ich nur zur Vollständigkeit aufgelistet.

      Ja hinter jeder Person sollen neue Spalten eingefügt werden und mit den Namen der anderen Familienmitglieder gefüllt werden. Wenn dies variabel nicht möglich ist können auch 5 (Max. Anzahl an Familienmitgliedern) feste Spalten eingefügt werden, die dann bei Bedarf gefüllt werden oder leer bleiben.

      Einen richtigen Ansatz habe ich nicht, weil ich fast keine Kenntnisse von SQL habe, einfache Abfragen zur Ausgabe der Familiennummer jeder Person bekomme ich noch hin:
      SELECT Person.Name, Person.vorname, Familie.Fam_Nr FROM Person JOIN Familie ON Person.Pers_ID = Familie.Pers_ID

      Aber leider aber ich nicht so recht eine Idee wie ich weiter vorgehen soll.

      Kommentar


      • #4
        Hm wenns rein über MySQL laufen soll (keine Ahnung ob andere SQLs da bessere Möglichkeiten haben) wirst du Gespeicherte Prozeduren brauchen.

        Ich würde wohl abfragen wie viele Familien es gibt und das ganze einer Variablen zuordnen
        PHP-Code:
        SET @anzahlFamilien := (SELECT COUNT(*) FROM (SELECT DISTINCT Fam_Nr FROM Familie) as familien); 
        Von da an muss ich mich selbst weiter schlau machen :/
        Die nächsten Schritte wären:

        PHP-Code:
        Schleife öffnen und für jede Familie durchlaufen
            
        Anzahl der Familienmitglieder des aktuellen Schleifendurchlaufs in neuer Variable speichernum die aktuelle Familie herauszufinden mit Limit und der Variable für den Schleifenzähler arbeiten
            
        Neue Schleife öffnen um für jedes Familienmitglied eine neue Spalte hinzuzufügengleicher Ablauf wie bei der Familie 
        Vielleicht melden sich ja noch welche die sich besser auskennen
        Relax, you're doing fine.
        RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

        Kommentar


        • #5
          Zitat von HHNF Beitrag anzeigen
          Leider weiß ich nicht so recht wie ich die SQL Abfrage hierfür formulieren muss. (Die Datenbank habe ich nicht entworfen, ich hätte das ggf. anders aufgebaut) Ich hoffe jemand kann mir dabei helfen

          Vielen Dank für eure Hilfe!
          Code:
          test=*# select * from personen ;
           id |  nachname  | vorname
          ----+------------+---------
            1 | Peters     | Karl
            2 | Mustermann | Max
            3 | Mustermann | Erika
            4 | Peters     | Karla
            5 | Mustermann | Hanna
          (5 rows)
          
          Time: 0,164 ms
          test=*# select * from familie ;
           id | fam_nr | person
          ----+--------+--------
            1 |      1 |      1
            2 |      2 |      2
            3 |      1 |      4
            4 |      2 |      5
            5 |      2 |      3
          (5 rows)
          
          Time: 0,147 ms
          test=*# select f.id, p.nachname, array_to_string(array_agg(p.vorname),', ') from familie f cross join lateral (select * from familie where fam_nr=f.fam_nr) x left join personen p on x.person=p.id group by f.id, p.nachname order by f.id;
           id |  nachname  |  array_to_string
          ----+------------+-------------------
            1 | Peters     | Karl, Karla
            2 | Mustermann | Erika, Max, Hanna
            3 | Peters     | Karl, Karla
            4 | Mustermann | Max, Erika, Hanna
            5 | Mustermann | Erika, Max, Hanna
          (5 rows)
          Mal ein CROSS JOIN LATERAL, lecker
          PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

          Kommentar


          • #6
            So funktioniert es, vielen Dank!

            Kommentar


            • #7
              Zitat von HHNF Beitrag anzeigen
              So funktioniert es, vielen Dank!
              Fein, was für eine DB hast Du?
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                Also doch nicht für jeden Name ne neue Spalte?
                Relax, you're doing fine.
                RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                Kommentar


                • #9
                  Ich verstehe noch nicht ganz, was du damit meinst. Aber nein, eine dynamische Anzahl Spalten tönt nicht gut.
                  GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                  Kommentar


                  • #10
                    Jo, aber wenn danach gefragt wird, was willst machen
                    Relax, you're doing fine.
                    RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                    Kommentar


                    • #11
                      Ehrlich gesagt, hatte ich an eine kommagetrennte Lösung nie gedacht, deshalb habe ich nur von einer dynamische Anzahl an Spalten gesprochen, für den csv Export ist das natürlich völlig ausreichend. (hätte ich vielleicht dazuschreiben sollen, sorry!)

                      Vielen Dank für eure Mühen!

                      Kommentar

                      Lädt...
                      X