[MySQL] JOIN - USING oder ON?

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

  • [MySQL] JOIN - USING oder ON?

    sodele, jetzt frag ich auch mal was zu joins

    warum kommt bei
    Code:
    SELECT 
    	t1.zahl, 
    	t2.quadrat, 
    	t3.kubik 
    FROM 
    	tabelle2 t2 
    	RIGHT JOIN tabelle1 t1 ON t2.tab1_id = t1.tab1_id 
    		LEFT JOIN tabelle3 t3 ON t1.tab1_id = t3.tab1_id
    das hier raus:
    Code:
    zahl | quadrat | kubik
       1 |    NULL |     1
       2 |       4 |     8
       4 |      16 |    64
       8 |      64 |  NULL
    bei
    Code:
    SELECT 
    	t1.zahl, 
    	t2.quadrat, 
    	t3.kubik 
    FROM 
    	tabelle2 t2 
    	RIGHT JOIN tabelle1 t1 USING(tab1_id)
    		LEFT JOIN tabelle3 t3 USING(tab1_id)
    aber das:
    Code:
    zahl | quadrat | kubik
       1 |    NULL |  NULL
       2 |       4 |     8
       4 |      16 |    64
       8 |      64 |  NULL
    sollte das nicht das gleiche sein oder überseh ich da was?
    Ich denke, also bin ich. - Einige sind trotzdem...

  • #2
    Quelle: http://www.mysql.com/doc/en/JOIN.html
    Posted by Paul Dodd on Monday September 30 2002, @7:33am


    Note that the form USING (X,Y) does not give the same results as the long form e.g. U ON (W.X = U.X AND W.Y = U.Y) when LEFT JOINing multiple tables. I suppose this is because with USING
    the left table is used for the comparison whereas with ON the specified table is used ...
    Mal geraten, was das für deine Query heißt (letzte Ergebniszeile):
    Bei "LEFT JOIN tabelle3 t3 ON" erkennt MySQL vermutlich, dass t1.tab_id identisch mit t2.tab_id sein soll ... und vergleicht t2.tab_id mit t3.tab_id statt der nicht vorhandenen t1.tab_id.
    Beim "USING" wird nur erkannt, dass t1.tab_id NULL ist - und damit werden für t3 auch keine Ergebnisse geliefert.
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      hab ich auch gelest aber trotzdem nicht verstanden, deshalb frag ich ja hier


      t1.tab1_id is nämlich eben _nicht_ NULL

      für mich ist das erste ergebnis nur nachvollziehbar, wenn mysql in beiden fällen in denen ich USING(tab1_id) verwende immer mit t2.tab1_id vergleicht, aber das dürfte es doch nicht, da ich t1 und t3 joine und nicht t2 und t3
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #4
        ähm ... Der Unterschied ist natürlich in der ersten und nicht in der letzten Zeile. Und da macht mein Gerate von oben latürnich keinen Sinn, da t1 existiert; nur t2 nicht.
        Dass die Zeile überhaupt da ist, liegt natürlich am right join.

        Aber warum nu der Unterschied zwischen "ON" und "USING" ... da muss ich mein Hirn nochmal verbiegen.

        PS: Vielleicht ist mein "Gerate" doch nicht so unsinnig ... immerhin ist das der einzige sichtbare Anhaltspunkt.
        mein Sport: mein Frühstück: meine Arbeit:

        Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

        Kommentar


        • #5
          wenn du deine Abfrage
          Code:
          SELECT 
          	t1.zahl, 
          	t2.quadrat, 
          	t3.kubik 
          FROM 
          	tabelle2 t2 
          	RIGHT JOIN tabelle1 t1 ON t2.tab1_id = t1.tab1_id 
          		LEFT JOIN tabelle3 t3 ON t1.tab1_id = t3.tab1_id
          mal als nur LEFT JOIN aufschreibst
          Code:
          SELECT 
          	t1.zahl, 
          	t2.quadrat, 
          	t3.kubik 
          FROM 
          	tabelle1 t1 
          	LEFT JOIN tabelle2 t1 ON t1.tab1_id = t2.tab1_id 
          		LEFT JOIN tabelle3 t3 ON t1.tab1_id = t3.tab1_id
          weißt du auch, warum er bei USING ein anderes Ergebniss hat.

          Bei dem LEFT JOIN wird bei der Tabelle "tabelle3" ein
          JOIN über "t1.tab1_id = t3.tab1_id" gemacht.

          Bei der USING Klausel nimmt er automatisch die vorhergehende
          Tabelle, würde also als ON Klausel dies nutzen
          "t2.tab1_id = t3.tab1_id"

          Da in diesem Falle t2.tabl_id NULL ist, wird auch t3.tabl_id NULL

          TBT

          Die zwei wichtigsten Regeln für eine berufliche Karriere:
          1. Verrate niemals alles was du weißt!


          PHP 2 AllPatrizier II Browsergame

          Kommentar


          • #6
            Original geschrieben von TBT
            Bei der USING Klausel nimmt er automatisch die vorhergehende
            Tabelle, würde also als ON Klausel dies nutzen
            "t2.tab1_id = t3.tab1_id"

            Da in diesem Falle t2.tabl_id NULL ist, wird auch t3.tabl_id NULL
            das is mir klar, deshalb hab ich ja auch nen RIGHT JOIN gemacht und tabelle1 in die mitte geschrieben, schließlich soll er ja auch tabelle1 nehmen

            tabelle1 left join tabelle3 using(tab1_id) sollte doch dann auch behandelt werden wie tabelle1.tab1_id=tabelle3.tab1_id, da tabelle1.tab1_id ja niemals NULL ist


            oder steh ich grad auf dem schlauch?
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              dann schau mal mit EXPLAIN wie MySQL das abarbeitet.
              RIGHT JOIN sollte meistens (oder immer?) intern auf einen
              LEFT JOIN abgebildet werden
              TBT

              Die zwei wichtigsten Regeln für eine berufliche Karriere:
              1. Verrate niemals alles was du weißt!


              PHP 2 AllPatrizier II Browsergame

              Kommentar


              • #8
                explain liefert mir bei meinen beiden selects exakt das gleiche

                wo steht denn, dass right join in left join umgewandelt wird? ich finde nur aussagen wie "right join ist analog zu left join implementiert"

                und selbst wenn, macht mysql diese umwandlung dann meiner meinung nach falsch, oder nicht?
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  und in welcher Reihenfolge stehen die Tabellen in der EXPLAIN Ausgabe ?
                  TBT

                  Die zwei wichtigsten Regeln für eine berufliche Karriere:
                  1. Verrate niemals alles was du weißt!


                  PHP 2 AllPatrizier II Browsergame

                  Kommentar


                  • #10
                    t1
                    t2
                    t3
                    (bei deinem select auch)

                    klingt, als ob mysql bei der USING variante
                    Code:
                    tabelle2 t2 
                    	RIGHT JOIN tabelle1 t1 USING(tab1_id)
                    		LEFT JOIN tabelle3 t3 USING(tab1_id)
                    t1 und t3 beide mit t2.tab1_id vergleicht obwohl im select was anderes steht meiner meinung nach
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      sag ich doch, er nimmt die Reihenfolge so, wie bei EXPLAIN
                      angegeben.

                      PS: ich nutze schon lange kein USING mehr, irgendeine DB
                      hatte mir für USING auf die Finger gehauen
                      (könnte der MS SQL gewesen sein) - seitdem nurnoch ON
                      TBT

                      Die zwei wichtigsten Regeln für eine berufliche Karriere:
                      1. Verrate niemals alles was du weißt!


                      PHP 2 AllPatrizier II Browsergame

                      Kommentar


                      • #12
                        alla gut, habs jetzt begriffen

                        aber irgendwie doof, dass nirgendwo bei mysql.com steht, dass sich joins prinzipiell auf die erste tabelle beziehen, es sei denn ich gebe explizit was anderes an (oder ich hätte es dort nicht gefunden)

                        fällt bei deren beispielen ja nicht auf, da die immer nur zwei tabellen so verknüpfen


                        danke für die erklärung
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          JOINS beziehen sich nicht immer auf die erste Tabelle !

                          wenn du ganz artig immer nur LEFT JOIN machst,
                          bezieht sich das USING immer? auf die vorherige.
                          Bei dem Mischmasch RIGHT/LEFT JOIN schau in die
                          EXPLAIN Ausgabe, in welcher Reihenfolge MySQL die
                          Tabellen abarbeitet. Dann weißte auch, worauf sich
                          das USING bezieht.
                          TBT

                          Die zwei wichtigsten Regeln für eine berufliche Karriere:
                          1. Verrate niemals alles was du weißt!


                          PHP 2 AllPatrizier II Browsergame

                          Kommentar


                          • #14
                            hast ja recht

                            ich schreib mir irgendwann mal mein eigenes sql, das macht dann auch right join so wie ich will

                            trotzdem danke
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar

                            Lädt...
                            X