Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem bei Abfrage aus zwei Tabellen

Einklappen

Neue Werbung 2019

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

  • Problem bei Abfrage aus zwei Tabellen

    Hallo liebe community. Ich stehe vor einem kleinen Problem mit einer Datenbankabfrage. Ich habe zwei fest vorgegebene Tabellen.
    In Tabelle1 stehen alle Väter die Kinder haben mit diesen:

    Tabelle1 (nur Väter, die auch Kinder haben)
    Kind Vater
    NameA NameVA
    NameB NameVA
    NameC NameVB
    NameD NameVC
    NameE NameVC

    In Tabelle2 stehen alle väter und alle Kinder mit weiteren Daten. Zusätzlich noch Väter, die keine Kinder haben.
    Tabelle2 (alle Personen)
    Namen Haarfarbe Augenfarbe
    NameA 12 1
    NameVA 13 5
    NameB 11 11
    NameVB 12 13
    NameC 12 14
    NameD 10 11
    NameE 4 10
    NameVC 8 3
    NameVX 11 5

    Nun muss ich das ganze so ausgeben, dass jeweils der Vater mit seinen eigenschaften und darunter seine Kinder mit allen eigenschaften aufgelistet werden. Dann der nächste Vater mit seinen Kindern etc.
    Soll Ausgabe (alle Väter mit ihren Kindern)
    Name Haarfarbe Augenfarbe
    NameVA 13 5
    -NameA 12 1
    -NameB 11 11

    NameVB 12 13
    -NameC 12 14

    NameVC 8 3
    -NameD 10 11
    -NameE 4 10

    NameVX 11 5
    -keine Kinder

    Kann mir dabei jemand weiterhelfen wo ich da am besten ansetzen kann?
    Wäre für jede Hilfe dankbar.
    Meine QIP-Blume ist blau! ^^


  • #2
    Ich habe zwei fest vorgegebene Tabellen.
    inwiefern fest vorgegeben? deine tabellen sind nämlich nicht normgerecht aufgebaut ! stichwort normalisierung..

    so auf die schnelle:
    eine eigene tabelle mit allen vorhandenen vätern
    id, name_von_Vater, haarfarbe_id, augenfarbe_id, id_von_kind(falls vorhanden)

    eine für die kinder
    id_ name_vom_kind, haarfarbe_id, augenfarbe_id

    eine für die haarfarbe
    id_ haarfarbe

    usw.

    und danach kannst dua uch ganz easy das sql query erstellen

    Kommentar


    • #3
      Gar nicht so einfach, wie es im ersten Moment aussieht. Dein Tabellenmodell habe ich leicht umgestellt. Es gibt nun eine Tabelle PERSON und KIND_HAT_VATER. Anbei eine mögliche Lösung plus Testdaten. Wobei VaterC keine Kinder hat.

      Erklärung
      In der Tabelle KIND_HAT_VATER gilt:
      kind_id = p_id (aus PERSON) und natürlich auch
      vater_id = p_id (aus PERSON).

      Code:
      CREATE TABLE person (
       p_id INT NOT NULL,
       name VARCHAR(50),
       haarfarbe INT,
       augenfarbe INT,
       
       PRIMARY KEY(p_id)
      );
      
      CREATE TABLE kind_hat_vater (
      
       kind_id INT NOT NULL,
       vater_id INT NOT NULL
      );
      
      INSERT INTO person VALUES
      ( 1, 'VaterA', 1, 2 ),
      ( 2, 'VaterB', 2, 4 ),
      ( 3, 'KindA', 3, 6 ),
      ( 4, 'KindB', 4, 8 ),
      ( 5, 'KindC', 5, 4 ),
      ( 6, 'VaterC', 7, 1 );
      
      
      
      INSERT INTO kind_hat_vater VALUES
      ( 3,1 ),
      ( 4,1 ),
      ( 5,2 );
      
      
      SELECT v1.vater_id * 100  AS sort, p.* FROM person p
               JOIN ( SELECT DISTINCT vater_id  FROM kind_hat_vater ) v1
                 ON v1.vater_id = p.p_id
                 
      UNION ALL
                 
      SELECT v1.vater_id * 100 + v1.kind_id AS sort, p.* FROM person p
               JOIN ( SELECT vater_id, kind_id FROM kind_hat_vater ) v1
                 ON v1.kind_id = p.p_id    
      
      
      UNION ALL
                 
      SELECT p.p_id * 100  AS sort, p.* FROM person p
       WHERE p.p_id NOT IN ( SELECT vater_id FROM kind_hat_vater )
         AND p.p_id NOT IN ( SELECT kind_id FROM kind_hat_vater )
      
      ORDER BY 1;
      
      
      +------+------+--------+-----------+------------+
      | sort | p_id | name   | haarfarbe | augenfarbe |
      +------+------+--------+-----------+------------+
      |  100 |    1 | VaterA |         1 |          2 |
      |  103 |    3 | KindA  |         3 |          6 |
      |  104 |    4 | KindB  |         4 |          8 |
      |  200 |    2 | VaterB |         2 |          4 |
      |  205 |    5 | KindC  |         5 |          4 |
      |  600 |    6 | VaterC |         7 |          1 |
      +------+------+--------+-----------+------------+
      6 rows in set (0.39 sec)
      
      mysql>
      Bestimmt eine Lösung für die Informatik-Hausaufgaben oder Bio?

      Achtung:
      Der Trick mit der Spalte "SORT" geht dann daneben, wenn ein Vater mehr als 99 Kinder hat.

      Grüße
      Thomas

      Kommentar


      • #4
        Erstmal vielen Dank für die Antworten!
        Dass die Tabellen nicht normgerecht sind weiß ich... Und genau da ist ja das Problem.
        Vorallem muss die Lösung erfolgen ohne die Tabellen zu ändern.
        Auf den ersten Blick dachte ich auch, dass es einfach wäre aber das ist es nicht...
        Ich habe an eine Lösung gedacht wie
        1. Tabelle2 Namen mit Tabelle1 Kind abgleichen.
        Alle, die nicht entsprechen müssen somit Väter sein. (wie packe ich die in einen Array? Es darf keine neue Tabelle angelegt werden.)
        2. Für jeden Vater -> Abgleich über Tabelle2 Vater ob der Vater zu den Kindern in Tabelle2 Kind gehört.
        Aber irfendwie komme ich nicht weiter.
        Meine QIP-Blume ist blau! ^^

        Kommentar


        • #5
          Wenn Du in meinem SQL die ".._id" Spalten wieder durch die entsprechenden "Namen" Spalten ersetzt, sollte es eigentlich auch funktionieren.

          Grüße
          Thomas

          Kommentar


          • #6
            [OT]
            Zitat von webba Beitrag anzeigen
            In Tabelle1 stehen alle Väter die Kinder haben mit diesen
            Mit „diesen“ können hier wohl nur wieder die Kinder gemeint sein - es geht also irgendwie um Inzest ...?
            [/OT]

            Kommentar

            Lädt...
            X