treziman: mehrere Tabellen verknüpfen

Hallo Forumgemeinde,

ich möchte euch wieder quälen...:-))

In meinem Projekt stiess ich auf die Notwendigkeit, aus zwei Tabellen Werte herauszuholen. Dies ist mir auch mit folgendem code gelungen:

<?php
...
$frage = "select tab1.wert1,tab1.wert2,tab1.wert3,tab2.wert1,tab2.wert2,tab2.wert3 from tab1 left join tab2 on tab1.wert1 = tab2.wert1 where bedingung1 ='$bedingung1' AND bedingung2 = '1'"
...
?>
Habe zur besseren Verständlichkeit die Bezeichnungen umbenannt.

Nun habe ich einen Punkt erreicht, an dem ich vier Tabellen miteinander verknüpfen müsste, weil die Abfrage und der code dann einfacher wären. Hier stosse ich wieder an meine Grenzen. Ich habe die Erklärungen zu diesem Thema, Tabellen verknüpfen, gelesen, komme aber nicht so recht damit klar. LEFT JOIN, INNER JOIN, usw. sind für mich immernoch unerklärlich.

Ich habe also mal mit folgendem code probiert:

<?php
...
$frage = "select tab1.wert1,tab2.wert1,tab3.wert1,tab4.wert1 from tab1,tab2,tab3,tab4 where bedingung = '$bedingung'";
...
?>
Geht, wie sollte es anders sein, nicht. Ich brauche also nur EINEN Wert aus einer der vier Tabellen. Könnt ihr mir auf die Sprünge helfen?
Ich kann die Tabellen einzeln abfragen. Kein Problem. Aber warum einfach, wenns auch schwer geht.

Gruss
Thorsten

  1. Hallo,

    $frage = "select tab1.wert1,tab1.wert2,tab1.wert3,tab2.wert1,tab2.wert2,tab2.wert3 from tab1 left join tab2 on tab1.wert1 = tab2.wert1 where bedingung1 ='$bedingung1' AND bedingung2 = '1'"
    ...
    ?>
    Habe zur besseren Verständlichkeit die Bezeichnungen umbenannt.

    das ist Dir glänzend misslungen. Sinnvolle Bezeichner sind viel besser verständlich als völlig nichtssagende aufzählende Bezeichner. Ich verstehe nicht im geringsten, worum es Dir geht.

    Nun habe ich einen Punkt erreicht, an dem ich vier Tabellen miteinander verknüpfen müsste, weil die Abfrage und der code dann einfacher wären.

    Ich habe also mal mit folgendem code probiert:

    poste kein PHP, wenn es um Datenbanken geht.

    Ich kann die Tabellen einzeln abfragen. Kein Problem. Aber warum einfach, wenns auch schwer geht.

    ja. Viel einfacher. Deine vier Tabellen, ein paar Datensätze und das gewünschte Ergebnis mit der Begründung, warum dies das gewünschte Ergebnis ist. Wenn Dein Ergebnis nur einen Datensatz enthalten soll, kann es gut sein, dass Du statt Joins eher Subselects verwenden möchtest.

    Interessehalber: wo endet Dein Verständnis dieser beiden Artikel:

    - Einführung in Joins
     - Fortgeschrittene Jointechniken

    Freundliche Grüße

    Vinzenz

    1. Hallo,

      Ich verstehe nicht im geringsten, worum es Dir geht.

      Ich brauche also nur EINEN Wert aus einer der vier Tabellen. Darum gehts. Wie formuliere ich eine solche Abfrage, wenn ich vier Tabellen miteinander verknüpfen will und es in allen vier Tabellen eine Spalte gleichen Namens gibt, die man mittels WHERE abfragen kann?

      Also etwa so: gib mir den Wert aus der Tabelle, in der die Bedingung erfüllt ist.

      ... dass Du statt Joins eher Subselects verwenden möchtest.

      Ich glaube, Subselects sind nicht das richtige.

      Interessehalber: wo endet Dein Verständnis dieser beiden Artikel:

      Ich beschäftige mich mit MYSQL erst seit ein paar Wochen. Bin da also Anfänger. Die ellenlangen Erklärungen dort helfen mir nicht, wenn mir niemand die dabei auftauchenden Fragen beantwortet.
      Habe mir gerade nochmal
      http://aktuell.de.selfhtml.org/artikel/datenbanken/joins/
      angeschaut. Aus diesem Beitrag dort werde ich nicht schlau und kann mir keine für mich passende Abfrage zusammenbasteln.
      Habe mir auch mal den anderen Link angeschaut. Dasselbe.

      Gruss
      Thorsten

      1. Hallo,

        Ich verstehe nicht im geringsten, worum es Dir geht.

        Ich beschäftige mich mit MYSQL erst seit ein paar Wochen. Bin da also Anfänger.

        Anfänger machen vieles falsch. Das ist normal. Es kann sehr gut sein, dass Dein Tabellendesign fehlerhaft ist. Das ist bei Anfängern auch normal.

        Ich brauche also nur EINEN Wert aus einer der vier Tabellen.

        Eine Abfrage liefert typischerweise Datensätze aus mehreren Spalten. In einer Spalte eines Datensatzes ist ein Wert enthalten.

        Möchtest Du einen Datensatz? Möchtest Du genau einen Wert, d.h. eine Ergebnismenge, die aus einem Datensatz mit einer einzigen Spalte besteht?
        Möchtest Du etwas anderes?

        Darum gehts. Wie formuliere ich eine solche Abfrage, wenn ich vier Tabellen miteinander verknüpfen will und es in allen vier Tabellen eine Spalte gleichen Namens gibt, die man mittels WHERE abfragen kann?

        Interessehalber: wo endet Dein Verständnis dieser beiden Artikel:
        Die ellenlangen Erklärungen dort helfen mir nicht, wenn mir niemand die dabei auftauchenden Fragen beantwortet.

        Diese Kritik hilft mir wenig, meinen Artikel zu verbessern. Mir wäre es lieber, Du könntest konkretisieren, bis wohin Du etwas verstanden hast - und was Du nicht verstanden hast.

        Rouven ist zu Mehrfachjoins alles andere als ellenlang. Es ist der letzte Absatz im Abschnitt "Joins allgemein".

        Ein Join verknüpft stets zwei Tabellen zu einer Ergebnistabelle. Beim Mehrfachjoin ist das auch nicht anders: zuerst werden zwei Tabellen per Join zu einer verknüpft, anschließend wird die Zwischenergebnistabelle mit der dritten Tabelle zu einer weiteren verknüpft und so weiter ...

        angeschaut. Aus diesem Beitrag dort werde ich nicht schlau und kann mir keine für mich passende Abfrage zusammenbasteln.
        Habe mir auch mal den anderen Link angeschaut. Dasselbe.

        Das ist mir unverständlich. Selbstverständlich steht dort etwas genau zu Deiner Frage drin. Es gibt sogar einen Punkt im Inhaltsverzeichnis dazu:

        Mehrere Tabellen mit JOIN verknüpfen - gleiche Joinspalten. Das ist laut

        Wie formuliere ich eine solche Abfrage, wenn ich vier Tabellen miteinander verknüpfen will und es in allen vier Tabellen eine Spalte gleichen Namens gibt, die man mittels WHERE abfragen kann?

        genau das, was Du suchst. OK, in meinem Beispiel gibts nur drei Tabellen. Die Erweiterung auf die vierte Tabelle erfolgt aber analog:

        SELECT  
            <kommagetrennte liste der gewünschten spalten>  
        FROM  
            tabelle1 t1  
        JOIN  
            tabelle2 t2  
        ON  
            t1.gemeinsamespalte = t2.gemeinsamespalte  
        JOIN  
            tabelle3 t3  
        ON  
            t1.gemeinsamespalte = t3.gemeinsamespalte  
        JOIN  
            tabelle4 t4  
        ON  
            t1.gemeinsamespalte = t4.gemeinsamespalte  
        
        

        oder wie Rouven direkt oberhalb seiner Ausführungen zum Mehfachjoin schreibt, gibt es DBMS (MySQL gehört dazu), die in diesem Fall eine spezielle Syntax anbieten:

        USING(gemeinsame_spalte(n))

        Ich kann mir allerdings vorstellen, dass Du etwas ganz anderes im Sinn hast:
        Du möchtest einen bestimmten Datensatz, der in einer der vier Tabellen vorkommt - wobei diese Tabellen in etwa den gleichen Aufbau haben.

        Wenn das der Fall ist, dann kannst Du Dein Ziel mit einer UNION erreichen. Aller Wahrscheinlichkeit nach sind in diesem Fall drei der vier Tabellen überflüssig, ein typischer Tabellendesignfehler von Anfängern.

        Um das bewerten zu können, wäre es - wie von mir bereits nachgefragt - sehr hilfreich, den tatsächlichen Grundaufbau der vier Tabellen zu haben, diese mit ein paar Beispieldaten gefüllt, und das gewünschte Ergebnis mit Begründung.

        Freundliche Grüße

        Vinzenz

        1. Hallo Vinzenz,

          erstmal danke für Deine umfangreiche Antwort!

          'UNION' war ein sehr guter Tip! Damit klappts:

          $frage = "select user_ID from tabelle1 where bedingung = '$eingabe' union select user_ID from tabelle2 where bedingung = '$eingabe' union select user_ID from tabelle3 where bedingung = '$eingabe' union select user_ID from tabelle4 where bedingung = '$eingabe'";

          Anfänger machen vieles falsch. Das ist normal. Es kann sehr gut sein, dass Dein Tabellendesign fehlerhaft ist. Das ist bei Anfängern auch normal.

          Bei allem Respekt, Du kennst mein Projekt nicht. Ich bin zwar mysql - Anfänger, nicht aber als Programmierer grundsätzlich. Warum es vier Tabellen gibt, hat schon seinen Sinn. Es gibt vier Bereiche mit unterschiedlichen Unterkategorien.

          Diese Kritik hilft mir wenig, meinen Artikel zu verbessern. Mir wäre es lieber, Du könntest konkretisieren, bis wohin Du etwas verstanden hast - und was Du nicht verstanden hast.

          Ich kann jetzt nur für mich schreiben, denke aber, es geht anderen auch so. Am besten verstehe ich Beispiele, die ich zurückverfolgen kann. Das heisst, einen fertigen Beispiel-code und dann erklären, wie er zusammengesetzt ist + Bedeutung. Dein Artikel ist sicher Leuten hilfreich, die "vom Fach" sind. Quereinsteiger-Anfängern aber nicht. Siehe mich. :-(
          Versucht man sich selbst z.B. die englische Sprache beizubringen, wird man scheitern. Sicher gibt es Wörterbücher, man braucht aber trotzdem jemanden, der einem erklärt, wie man Sätze formuliert. Oder eben konkrete Beispiele dazu.

          Aber nochmal danke für den Tip 'union'.
          Gruss
          Thorsten

          1. Hallo,

            Diese Kritik hilft mir wenig, meinen Artikel zu verbessern. Mir wäre es lieber, Du könntest konkretisieren, bis wohin Du etwas verstanden hast - und was Du nicht verstanden hast.
            Ich kann jetzt nur für mich schreiben, denke aber, es geht anderen auch so. Am besten verstehe ich Beispiele, die ich zurückverfolgen kann. Das heisst, einen fertigen Beispiel-code und dann erklären, wie er zusammengesetzt ist + Bedeutung.

            aber das ist doch genau meine Vorgehensweise:

            a) ich stelle eine Aufgabe vor, die es zu lösen gilt
            b) ich gebe das dazu erforderliche SQL-Statement an
            c) das Ergebnis wird angezeigt
            d) das SQL-Statement wird erläutert
            e) weiterführende Hinweise

            Dein Artikel ist sicher Leuten hilfreich, die "vom Fach" sind. Quereinsteiger-Anfängern aber nicht. Siehe mich. :-(

            Zielpublikum des Artikels sind nicht Leute vom Fach. Die wissen das sowieso, wenn sie wirklich vom Fach sind. Zielgruppe sind Anfänger und Quereinsteiger. Steht im Artikel.

            Freundliche Grüße

            Vinzenz

            1. Vinz, dein Artikel konnte unserem Sportsfreund treziman (Programmierer!!) einfach nicht die Lösung auf dem Silbertablett liefern. ;-)
              Cheers, Frank

              1. Vinz, dein Artikel konnte unserem Sportsfreund treziman (Programmierer!!) einfach nicht die Lösung auf dem Silbertablett liefern. ;-)
                Cheers, Frank

                Wer lesen kann (auch zwischen den Zeilen...)ist klar im Vorteil. Die Lösung habe ich mir dann doch selbst nach dem Stichwort 'union' zusammengebaut. Nix Silbertablett.

                @Frank
                Deine Beiträge sind mit Abstand die hilfreichsten.

                @Vinzenz
                Du hast Dir mit Deinem Artikel sehr viel Mühe gegeben, zweifellos. Du musst Dir aber vorstellen, dass Du jemandem, der zwar die Befehle kennt, sie aber nicht in das richtige Format bringen kann - eben ein Anfänger - etwas beibringen sollst. Man kennt SELECT, FROM, LEFT JOIN usw. Aber WIE werden diese Befehle bei welcher Problemstellung angewendet und angeordnet?
                Ich habe mir z.B. eine code-Zeile mit LEFT JOIN zusammengebaut. Aber wie man das macht, habe ich aus einem anderen Forum, wo ein Mitglied einem anderen dies genau erklärt hat.
                Oder mal anders formuliert: für MICH ist Dein Artikel etwas zu umständlich. Einfacher wäre vielleicht so:

                Problemstellung oder Anwendungsmöglichkeit:
                "Hole einen Wert aus einer von zwei Tabellen"

                code: "select...blabla...";

                Erklärung: "...blabla..."

                Fertig. Müsste eigentlich jeder mit klarkommen.

                Aber nichts für ungut. Du hast mir im Nachhinein geholfen ('union'). Und wer Fragen zu Deinem Artikel hat, der kann ja hier posten. Nur sorge dann bitte dafür, dass Du oder ein anderer kompetenter Helfer dieses dann beantworten. Es gibt leider in jedem Forum "Sportsfreunde", die sich sehr wichtig nehmen und mehr als kompetente Antworten schreiben.

                Nochmal dankeschön, Vinzenz!

                Gruss
                Thorsten

  2. Hallo,

    Habe zur besseren Verständlichkeit die Bezeichnungen umbenannt.

    Das ging in die Hose!

    Und

    Geht, wie sollte es anders sein, nicht.

    ist keine Fehlerbeschreibung, das nur mal am Rande.

    "from tab1,tab2,tab3,tab4" dürfte ein ziemlich grosses Zwischenergebnis verursachen, ein karthesisches Produkt von allen Datensätzen aus allen 4 Tabellen. Bei nur 100 Datensätzen hättest du 100 * 100 * 100 * 100 Ergebnisse, die danach wieder auf "bedingung='$bedingung'" eingegrenzt werden müssen. Ich erspare mir weitere Kommentare zur Sinnhaftigkeit dessen.

    In welcher Beziehung stehen die 4 Tabellen zueinander?

    Ohne genauere Kenntnis deines Datenmodells ist jeder Hilfeversuch nur Kaffeesatzdeuten.

    Ciao, Frank

    1. moin,

      "from tab1,tab2,tab3,tab4" dürfte ein ziemlich grosses Zwischenergebnis verursachen, ein karthesisches Produkt von allen Datensätzen aus allen 4 Tabellen. Bei nur 100 Datensätzen hättest du 100 * 100 * 100 * 100 Ergebnisse, die danach wieder auf "bedingung='$bedingung'" eingegrenzt werden müssen. Ich erspare mir weitere Kommentare zur Sinnhaftigkeit dessen.

      das ist eine falsche annahme, es gibt kein zwischenergebnis als  karthesisches Produkt. die bedinungn in der WHERE klausel wird beachtung finden, welche das auch immer ist. und wenn es sich um bedinungen handelt, wie die tabellen miteinander verknüpft sind, dann handelt es sich einfach um die implizite JOIN schreibweise, die früher sehr verbreitet (zumindestens in oracle) war und leider auch noch ist.

      Ilja