Ankündigung

Einklappen
Keine Ankündigung bisher.

INNER JOIN über 3 Tabellen

Einklappen

Neue Werbung 2019

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

  • INNER JOIN über 3 Tabellen

    Hi zusammen ,

    ich bin neu hier und habe mich hier angemeldet da ich leider nicht mehr weiterkomme mit meinen Kenntnissen.

    Die unteren Tabellen spiegeln mein Projekt nicht 1:1 wieder da ich dies noch nicht veröffentliche möchte, ich wäre euch trotzdem dankbar über eure Hilfe !

    DARSTELLUNG DER DATENBANK
    Wir haben eine Datenbank mit 2 Tabellen (tbl_zubehoer ; tbl_auto) , diese haben eine n:m Beziehung daher wird wie ich es richtig verstanden haben noch eine weitere Tabelle (tbl_verbindung) zwischengeschaltet die die Primärschlüssel der beiden Haupttabellen verbindet. Somit entsteht ja eine n:m Beziehung.

    tbl_zubehoer
    id_zubehoer name_zubehoer
    1 Reifen
    2 Scheibe




    tbl_verbindung (ps=Primärschlüssel)
    id_ps_tbl_zubehoer id_ps_tbl_auto
    1 1
    2 1
    1 2
    tbl_auto
    id_auto name_auto
    1 Mercedes
    2 Audi
    FUNKTION
    Auf unserer Website haben wir eine Suchleiste welche die Zubehör Tabelle (tbl_zubehoer) durchsuchen soll.
    Dort geben wir z.B.: "Scheibe" ein, klicken auf Suchen und es wird dann später folgender Datensatz angezeigt:

    Mercedes ; Reifen , Scheibe

    Da nur der "Mercedes" eine "Scheibe" in der Datenbank eingetragen hat.

    ODER

    "Reifen" eingeben und das Ergebnis sieht wie folgt aus:

    Mercedes ; Reifen , Scheibe
    Audi ; Reifen

    //Bisher habe ich den Inhalt aus tbl_zubehoer und tbl_verbindung anzeigen lassen können. Den Inhalt aus tbl_auto noch nicht. Wie gesagt bis dahin hat es funktioniert nur verstehe ich das ganze mit INNER JOIN leider nicht.


    Mein Code bisher

    SELECT name_zubehoer
    FROM tbl_zubehoer
    INNER JOIN tbl_auto
    ON ( tbl_zubehoer.name_zubehoer = tbl_auto.name_auto )
    .
    .
    .
    echo "<div>";
    echo "<h3>".$row['tbl_auto.name_auto']."</h3>";
    echo "<p>".$row['tbl_zubehoer.name_zubehoer']."</p>";
    echo "<p>".$row['tbl_zubehoer.name_zubehoer']."</p>";
    echo "</div>";
    .
    .
    .

    Wie bekomme ich meine gewünschten Ergebnisse angezeigt wie in unserem Beispiel?

  • #2
    Die tbl_verbindung solltest du tbl_zubehoer_auto oder so in der Art nennen!
    Wenn du nämlich mehrere n:m-Tabellen hast, dann wirds unübersichtlich.
    Den Join machst du in diesem Fall implizit, nämlich so:
    Code:
    SELECT ta.name_auto,tz.name_zubehoer 
    FROM tbl_auto ta,tbl_zubehoer tz,tbl_zubehoer_auto tza 
    WHERE ta.id_auto=tza.id_ps_tbl_auto AND
    tz.id_zubehoer=tza.id_ps_tbl_zubehoer

    Kommentar


    • #3
      Danke dir! Ich werde es heute oder morgen direkt ausprobieren und in meinen Code einpflegen

      Kommentar


      • #4
        Ich würde empfehlen die Joins auszuschreiben, da der Code sonst schnell schwer lesbar und unübersichtlich wird.
        Code:
        SELECT     ta.name_auto, tz.name_zubehoer
        FROM       tbl_auto ta
        INNER JOIN tbl_zubehoer_auto tza ON ( ta.id_auto = tza.id_ps_tbl_auto )
        INNER JOIN tbl_zubehoer tz ON ( tz.id_zubehoer = tza.id_ps_tbl_zubehoer )
        Kryptische Spaltennamen wie "id_ps_tbl_zubehoer" sind auch nicht gerade lesbar. Warum nicht einfach zubehoer_id?

        Und es ist unnötig, dass alle Tabellennamen mit tbl_ beginnen. Hier ein Beispiel mit einfacheren und kürzeren Namen:
        Code:
        SELECT     a.name AS auto_name, z.name AS zubehoer_name
        FROM       auto a
        INNER JOIN zubehoer_auto za ON ( a.id = za.auto_id )
        INNER JOIN zubehoer z ON ( z.id = za.zubehoer_id )
        Ist das nicht wesentlich angenehmer als das Gewusel oben?

        Kommentar


        • #5
          hellbringer und csabinho nochmals vielen Dank euch und nachträglich ein schönes Neues !

          Habe noch einiges herum probiert und es funktioniert soweit, nur das Ergebnis ist noch nicht ganz das was ich möchte .
          Ich habe den oberen Code von hellbringer bei mir eingepflegt und ja du hast recht dass es so übersichtlicher aussieht aber du musst wissen ich fühle mich noch sehr unsicher bei PHP.
          Wenn mein Code zum Schluss funktioniert werde ich diesen übersichtlicher gestalten. Ist zwar mehr arbeit aber mir ist es erstmal wichtiger dass es funktioniert .

          Eine weitere Frage

          Nun kommen wir zu einem weiteren Problem, wenn wir nach "Scheibe" suchen und zweimal "<echo>" wie hier in dem Beispiel angegeben habe erscheint zweimal das Zubehörteil Scheibe aber es soll nur einmal aufgelistet werden sowie alle weiteren Teile die in dem Auto zu finden sind bzw. in der Datenbank hinterlegt sind.
          Und wenn keine weiteren Teile hinterlegt sind sollen diese auch nicht angezeigt werden.

          PHP-Code:
          echo "<div>";
          echo 
          "<h3>".$row['tbl_auto.name_auto']."</h3>";
          echo 
          "<p>".$row['tbl_zubehoer.name_zubehoer']."</p>";
          echo 
          "<p>".$row['tbl_zubehoer.name_zubehoer']."</p>";
          echo 
          "</div>"

          IST-Wert
          Mercedes
          Scheibe
          Scheibe

          SOLL-Wert
          Mercedes
          Scheibe
          Reifen

          Kommentar


          • #6
            Zitat von MacDilles Beitrag anzeigen
            Wenn mein Code zum Schluss funktioniert werde ich diesen übersichtlicher gestalten. Ist zwar mehr arbeit aber mir ist es erstmal wichtiger dass es funktioniert
            Davon möchte ich dir aus mindestens zwei Gründen abraten:

            1. lesbarer Code funktioniert besser. Wenn du unübersichtlichen Code hast, der dann ggf. nicht mal mit allen Möglichkeiten durchgetestet ist, baust du da schnell logische Fehler ein, und wegen solchem Kram landest du wieder hier

            2. du räumst sowieso nicht auf. Dir fällt dann noch dies und das ein, oder irgend ein neues Feature, oder du bist mit Wartung beschäftigt, eben weil dein Code murks ist - und dann noch Refactoring machen, das üblicher Weise keinen Spass macht?

            Mein Tipp: Mach es richtig, so lange du noch den Überblick hast. Wenn etwas überflüssig ist -> gleich wegschmeissen. Oder archivieren.
            [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

            Kommentar


            • #7
              Ok danke chorn ich bin nun dabei das Ganze zu verbessern.

              Aber um nochmal zurück zukommen auf meine vorherige Frage:

              Zitat von MacDilles Beitrag anzeigen

              Eine weitere Frage

              Nun kommen wir zu einem weiteren Problem, wenn wir nach "Scheibe" suchen und zweimal "<echo>" wie hier in dem Beispiel angegeben habe erscheint zweimal das Zubehörteil Scheibe aber es soll nur einmal aufgelistet werden sowie alle weiteren Teile die in dem Auto zu finden sind bzw. in der Datenbank hinterlegt sind.
              Und wenn keine weiteren Teile hinterlegt sind sollen diese auch nicht angezeigt werden.

              PHP-Code:
              echo "<div>";
              echo 
              "<h3>".$row['tbl_auto.name_auto']."</h3>";
              echo 
              "<p>".$row['tbl_zubehoer.name_zubehoer']."</p>";
              echo 
              "<p>".$row['tbl_zubehoer.name_zubehoer']."</p>";
              echo 
              "</div>"

              IST-Wert
              Mercedes
              Scheibe
              Scheibe

              SOLL-Wert
              Mercedes
              Scheibe
              Reifen

              Kommentar


              • #8
                Schreib halt nicht zweimal das echo? Oder was ist jetzt das Problem?

                Kann es sein, dass du einen "Gruppenbruch" suchst?

                Kommentar


                • #9
                  Denke ich, liegt an der Query, die nicht dargestellt ist, kann ich dir nicht helfen dabei.

                  Wenn du Probleme mit der SQL-Sprache hast, rate ich zu folgendem Forum:
                  http://www.datenbankforum.com/

                  Dort wurde mir die SQL-Sprache bei weitem näher gebracht, als ich dachte ^^
                  Anbei verstehe ich auch nicht, wenn du 2 mal einen Paragraphen mit dem gleichem Inhalt "echost", warum du dich wunderst, dass es auch 2 mal angezeigt wird(?)

                  Anmerkung:
                  Falls "Werbung" für andere Foren unerwünscht ist, tut es mir leid, aber ich denke, es ist ein SQL-Problem.

                  PHP kann Inhalte aus einer Abfrage darstellen, sprich es sollte auch der Query-Code vorhanden sein, für effektive verbesserungsvorschläge und lösungsmöglichkeiten.
                  Habe mehr Ahnung von SQL, als von PHP ^^

                  Kommentar


                  • #10
                    Danke euch beiden .

                    Ich denke ich habe den "Gruppenbruch" gesucht zumindest sieht es hierbei https://php-de.github.io/jumpto/gruppenbruch/ danach aus.
                    Werde auch mal das andere Forum durchkämmen

                    Kommentar

                    Lädt...
                    X