Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage zu Inner Join

Einklappen

Neue Werbung 2019

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

  • Frage zu Inner Join

    Hallo
    habe hier mehrere Tabellen und muss aus versch. Tabellen die Werte ziehen.
    Dazu möchte ich Inner Join verwenden da ich zum Schluss auch eine Abfrage machen muss.

    hier nur ein Bespiel (Ich muss jedoch aus drei versch. Tabellen bestimmte Werte entnehmen)

    wenn ich
    Code:
    SELECT N_Container.N_Container_Id
    FROM N_Container d
    INNER JOIN Water_Info b ON d.N_Container_Id <> b.N_Container_Id
    verwendet kommt
    Unknown column 'N_Conatainer.N_Container_Id' in 'field list'

    wenn ich dagegen
    Code:
    SELECT *
    FROM N_Container d
    INNER JOIN Water_Info b ON d.N_Container_Id <> b.N_Container_Id
    funktioniert es

    ich muss mit den Tabellennamen arbeiten da ich auch versch. Tabellen zu greife und dort die Werte benötige

    ich versteh das nicht die Spalte N_Container_Id ist in N_Container ja vorhanden

    weiss jemand Rat?
    Im netz habe ich zwar schon einiges über Inner Joins gelesen aber noch nicht was/wann/wieso nicht funktioniert

    Gruß Jürgen

  • #2
    Du weist aber schon, dass du da einen Tippfehler hast?
    "Conatainer"

    Kommentar


    • #3
      Zitat von monolith Beitrag anzeigen
      Du weist aber schon, dass du da einen Tippfehler hast?
      "Conatainer"
      ja sorry ich habe den code abgetippt
      real stimmt er jedoch...

      habs oben geändert

      weisst du wieso der mir einen Fehler auswirft wenn ich den Tabellennamen.spaltennamen
      mit angebe?

      Kommentar


      • #4
        Code:
        FROM N_Container d
        Wenn du schon den alias d setzt, nutze ihn auch.
        [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

        Kommentar


        • #5
          Genau, mir ist ebenfalls nicht klar, warum du statt
          Code:
          SELECT N_Container.N_Container_Id
          gleich mit Kanonen auf Spatzen schießen musst mit
          Code:
          SELECT *
          statt einfach:
          Code:
          SELECT d.N_Container_Id

          Kommentar


          • #6
            Zitat von monolith Beitrag anzeigen
            Genau, mir ist ebenfalls nicht klar, warum du statt
            Code:
            SELECT N_Container.N_Container_Id
            gleich mit Kanonen auf Spatzen schießen musst mit
            Code:
            SELECT *
            statt einfach:
            Code:
            SELECT d.N_Container_Id
            ich verstehe nur noch Bahnhof

            ich muss jetzt anders Fragen um es zu kapieren

            hier der Code ohne alias

            Code:
            SELECT N_Container.N_Container_Id
            FROM N_Container
            INNER JOIN Water_Info  ON N_Container.N_Container_Id <> Water_Info.N_Container_Id
            mit diesem Befehl kommt zwar kein Fehler

            es werden jedoch alle ID's ausgegeben

            da ich jedoch <> verwendet sollten 2 ID's fehlen die bereits in Water_Info gespeichert sind

            die Water_Info hat eine Spalte mit einer bestimmten ID des N_Container.N_Container_Id

            ich möchte jedoch nur die Datensätze aus der N_Container lesen die noch nicht in der Water_Info verwendet werden

            deswegen <>

            Gruß Jürgen

            ps..
            ich habe in der N_Container insgesamt 5 Einträge also 5 ID's (17,18,19,20 und 21)
            in der Water_Info habe ich 2 Einträge die mit den Einträgen der N_Container_ID aif die ID's der N_Container Tabelle verweisen
            in der Water_INfo habe ich 2 Einträge mit den IS's der N_Container 19 und 20

            wenn ich den o.g. Befehl ausführe dann bekomme ich alle ID's der N_Container doppelt bis auf die Einträge die auch in der Water_Info stehen. Diese kommen werden einzeln angezeigt.
            ich erhalte also
            17
            17
            18
            18
            19
            20
            21
            21

            wieso?

            Kommentar


            • #7
              Kann mir hier keiner helfen?

              Gruß Jürgen

              ps. mit dem
              Code:
              SELECT N_Container.N_Container_Id
              FROM N_Container
              INNER JOIN Water_Info  ON N_Container.N_Container_Id <> Water_Info.N_Container_Id
              erhalte ich alle Einträge aus der N_Container doppelt bis auf die beiden Einträge die auch in der Water_Info stehen
              also
              17
              17
              18
              18
              19
              20
              21
              21

              wenn ich mit Group by am Ende arbeite
              erhalte ich
              17
              18
              19
              20
              21

              er ignoriert also komplett das <>

              wenn ich mit "="
              arbeite
              dann erhalte ich nur die beiden Einträge die auch in der Water_Info stehen
              also
              19
              20

              wieso?

              Gruß Jürgen

              Kommentar


              • #8
                Simpel:

                Code:
                SELECT N_Container.N_Container_Id
                FROM N_Container 
                WHERE N_Container_Id NOT IN (
                    SELECT N_Container_Id 
                    FROM Water_Info
                )
                oder mit Join:

                Code:
                SELECT N.N_Container_Id
                FROM N_Container N LEFT JOIN Water_Info W 
                ON N.N_Container_Id = W.N_Container_Id
                WHERE W.N_Container_Id IS NULL
                Beim ON im Join nicht <> verwenden sondern =! D. h. erst mal sagst du damit welche Attribute verglichen werden sollen. In dem Fall ist das ja N_Container_Id der beiden Tabellen. Wichtig zu wissen ist dabei, dass du auch nach der Vereinigung der beiden Tabellen noch auf die ursprünglichen Attribut-Werte zugreifen kannst, also mit W.N_Container_Id auf den ursprünglichen Wert aus Water_Info. Als Join verwenden wir einen Left Join. D. h. alle Zeilen (Datensätze) aus der linken Tabelle, hier N_Container, werden bei der Vereinigung beibehalten - egal ob es nun in der rechten Tabelle, hier Water_Info, eine Entsprechung gibt oder nicht. Sollte es das nicht geben, dann ist das Attribut W.N_Container_Id = null. Das kann man nutzen, um diese Datensätze in der Where-Klausel auszusortieren.

                Also wichtig für die Zukunft: Im ON-Teil mit = arbeiten! Die MySQL-Dokumentation weist darauf extra hin: "Im ON-Teil sollten keine Bedingungen vorhanden sein, die zur Beschränkung der Datensätze in der Ergebnismenge verwendet werden; geben Sie solche Bedingungen besser in der WHERE-Klausel an." (http://dev.mysql.com/doc/refman/5.1/de/join.html)

                Kommentar


                • #9
                  Hallo,

                  wow
                  das funktioniert was Du mir geschrieben hast
                  Danke!!!

                  ich verstehe nur die logik nicht wieso ich nicht mit ungleich <> oder mit =! arbeiten kann

                  ich hätte das jetzt so geschrieben
                  Code:
                  SELECT N.N_Container_Id
                  FROM N_Container N LEFT JOIN Water_Info W 
                  ON N.N_Container_Id =! W.N_Container_Id
                  aber das geht nicht

                  in einigen Abfragen muss ich über 3 oder 4 Tabellen abfragen da wird das dann schon recht komplex...

                  die WHERE Klausel ist also dann notwendig wenn ich auf NULL anfragen muss?
                  wenn ich z.B. auf "=" abfrage geht es ja oder?

                  Mich verwirrt hierbei das wenn ich auf Gleichheit abfrage es mit INNER JOIN geht
                  nur eben nicht auf ungleich

                  Gruß Jürgen

                  Kommentar


                  • #10
                    Ich denke du musst deine Auffassung davon, was ein JOIN ist und wie er funktioniert, ändern
                    Ein Join soll zwei Tabellen miteinander vereinen, dabei aber auch einen weiteren Aspekt berücksichtigen. Mit z. B. UNION kann man zwei Tabellen stumpf hintereinander hängen. Ein hingegen Join kann mehr: Er kann anhand von einem oder mehreren Attributen die Datensätze zweier Tabellen finden, die miteinander verbunden sind. Sozusagen auf zwei Tabellen verteilte Datensätze wieder zusammenbauen. ON gibt dabei an, über welches Attribut der Zusammenhang besteht. Die mit ON benannten Attribute werden dann zu einem verschmolzen. Es ist nicht dafür gedacht, Datensätze auszufiltern. Genau das sagt die Dokumentation ja auch explizit. Denn wie soll man zwei Attribute verschmelzen, wenn man dabei vorgibt, dass diese eben NICHT den gleichen Wert haben sollen? Mit ON tabelle1.attribut1 <> tabelle1.attribut1 sagst du sinngemäß: Veschmelze die Attribute, wenn man sie nicht verschmelzen lassen kann! Also sagen wir tabelle1 hat genau einen Datensatz mit dem Wert 1 für attribut1 und tabelle2 genau einen Datensatz mit dem Wert 2 für attribut2. Was du dann sagst ist: "Mache bitte aus dem Wert 1 und dem Wert 2 ein gemeinsames neues Attribut". Wie soll das gehen? Welchen Wert soll das Attribut denn dann haben, 1 oder 2?* Deshalb, noch einmal: Nutze = in der ON-Klausel!

                    * = Was MySQL dann tut ist: MySQL geht die Tabelle N_Container Datensatz für Datensatz durch. Es nimmt dass Attribut N_Container_Id und schaut für alle N_Container_Id aus der Tabelle Water_Info, ob es ungleich ist. Falls ja, wird der Datensatz in die vereinigte Tabelle übenrommen, falls nein, nicht. D. h. für N_Container_Id = 17 findet MySQL zwei mal heraus, dass es in der Tabelle Water_Info keine übereisntimmung mit N_Container_Id gbt (da 19 und 20 ja nicht gleich 17 sind). Für 19 ist das aber anders: 19 steht auch in der Tabelle Water_Info, daher scheidet diese Möglichkeit aus. Der zweite Datensatz aus Water_Info hat aber für N_Container_Id den Wert 20, und da 19 nicht gleich 20 ist, wird der Datensatz insgesamt einmal mit in die vereinigte Tabelle übernommen.

                    PS: != ist das gleiche wie <> (siehe http://dev.mysql.com/doc/refman/5.0/...ator_not-equal)

                    Kommentar


                    • #11
                      Zitat von monolith Beitrag anzeigen
                      Ich denke du musst deine Auffassung davon, was ein JOIN ist und wie er funktioniert, ändern
                      Ein Join soll zwei Tabellen miteinander vereinen, dabei aber auch einen weiteren Aspekt berücksichtigen. Mit z. B. UNION kann man zwei Tabellen stumpf hintereinander hängen. Ein hingegen Join kann mehr: Er kann anhand von einem oder mehreren Attributen die Datensätze zweier Tabellen finden, die miteinander verbunden sind. Sozusagen auf zwei Tabellen verteilte Datensätze wieder zusammenbauen. ON gibt dabei an, über welches Attribut der Zusammenhang besteht. Die mit ON benannten Attribute werden dann zu einem verschmolzen. Es ist nicht dafür gedacht, Datensätze auszufiltern. Genau das sagt die Dokumentation ja auch explizit. Denn wie soll man zwei Attribute verschmelzen, wenn man dabei vorgibt, dass diese eben NICHT den gleichen Wert haben sollen? Mit ON tabelle1.attribut1 <> tabelle1.attribut1 sagst du sinngemäß: Veschmelze die Attribute, wenn man sie nicht verschmelzen lassen kann! Also sagen wir tabelle1 hat genau einen Datensatz mit dem Wert 1 für attribut1 und tabelle2 genau einen Datensatz mit dem Wert 2 für attribut2. Was du dann sagst ist: "Mache bitte aus dem Wert 1 und dem Wert 2 ein gemeinsames neues Attribut". Wie soll das gehen? Welchen Wert soll das Attribut denn dann haben, 1 oder 2?* Deshalb, noch einmal: Nutze = in der ON-Klausel!


                      PS: != ist das gleiche wie <> (siehe http://dev.mysql.com/doc/refman/5.0/...ator_not-equal)
                      vielen Dank für Deine Ausführung

                      hoffe ich kapiere es irgendwie

                      Vielleicht kannst Du mir noch einen Tipp geben ob ich mit Joins arbeiten soll/muss oder nicht

                      Ich habe meine DB so aufgebaut

                      Ich schreibe hier als Beispiel nur kurz Namen

                      Raum
                      Raum_ID
                      Raum_Nr
                      Raum_Temp
                      Raum_Luftfeuchtigkeit
                      etc. etc

                      Container
                      dort stehen die Daten des Containers (das sind meine Becken)
                      Container_ID
                      Inhalte_Liter
                      Tiefe
                      Sensor_Tiefe_max
                      Sensor_Tiefe_min
                      etc. etc

                      Da dieses Becken heute ein Süßwasser sein kann und morgen ein Salzwasser oder aber heute in Raum-1 oder Raum-2 stehen kann verweise ich später nur auf die jeweiligen ID's in der Water_INfo

                      Dann habe ich noch den Becken_Typ
                      habe ich den Becken_Typ in einer anderen Tabelle stehen
                      dort steht dann
                      Becken_Typ_ID
                      Becken_Typ
                      etc. etc

                      In der Water_Info
                      steht
                      Water_Info_Id
                      Conatiner_Id
                      Raum_ID
                      Becken_Typ_Id
                      Temp
                      PH_Wert
                      etc. etc

                      nun möchte ich natürlich nicht auf meiner Webseite nur die ID's sehen sondern auch was sich z.B. als Beckentyp dahinter verbirgt

                      ich frage also die jeweiligen Tabellen ab und vergleiche dort nach den ID's die ich in der Water_Info habe

                      Wenn man so seine Tabellen aufgebaut hat, ist es dann sinnvoll mit joins zu arbeiten
                      oder geht das mit
                      Code:
                      select Container.Inhalte_Liter , Becken_Typ.Becken_Typ , Raum.Raum_Nr
                      from
                      Container, Becken_Typ, Raum, Water_Info
                      WHERE
                      Water_Info.Becken_Typ_Id =  Becken_Typ. Becken_Typ_Id
                      AND
                      Water_Info.Container_Id =  Container. Container_Id
                      AND
                      Water_Info.Raum_Id = Raum.Raum_Id
                      ab und an muss ich mir dann jedoch den sogenannten Rest ausgeben lassen, also alle Container die noch nicht verwendet werden
                      deshalb musste ich in meiner Fragestellung auf ungleich abfragen

                      die Frage ist nun, wenn man so wie ich mit reinen ID's arbeitet die auf was verweisen ob man dann besser mit normalen Anfragen arbeiten sollte oder gleich mit JOINS

                      Sorry ... das ist womöglich einen totale Dummie Frage aber in den deutschen Dokus die ich im Netz fand konnte ich das nicht klar heraus lesen

                      Gruß Jürgen

                      Kommentar


                      • #12
                        from
                        Container, Becken_Typ, Raum, Water_Info
                        Das ist eine alternative Schreibweise für einen Join, also das gleiche wie
                        from
                        Container JOIN Becken_Typ JOIN Raum JOIN Water_Info
                        und das gleiche wie
                        from
                        Container INNER JOIN Becken_Typ JOIN Raum INNER JOIN Water_Info
                        (http://dev.mysql.com/doc/refman/5.1/de/join.html)

                        Kommentar


                        • #13
                          Zitat von monolith Beitrag anzeigen
                          Das ist eine alternative Schreibweise für einen Join, also das gleiche wie

                          und das gleiche wie

                          (http://dev.mysql.com/doc/refman/5.1/de/join.html)
                          ok das habe ich etwas verstanden

                          aber wieso schreibst Du
                          Code:
                          Container INNER JOIN Becken_Typ JOIN Raum INNER JOIN Water_Info
                          und genau um den Bereich
                          Code:
                          Becken_Typ JOIN Raum
                          warum schreibst du hier nicht INNER JOIN und nur JOIN?

                          Kommentar


                          • #14
                            Achso, das habe ich vergessen. Jedenfalls ist JOIN das gleiche wie INNER JOIN.

                            Kommentar


                            • #15
                              Zitat von monolith Beitrag anzeigen
                              Achso, das habe ich vergessen. Jedenfalls ist JOIN das gleiche wie INNER JOIN.
                              ich glaube ich kenne jetzt meinen Fehler bzw. meine falsche Denkweise

                              Wenn ich in der
                              FROM Tabelle1, Tabelle2
                              LEFT JOIN Tabelle2 ON
                              .......

                              verwende bekomme ich Fehler
                              Unknown Colume name etc.


                              ich darf also alles was ich in der ON Klausel verwende bzw. die Tabellenamen die ich nach dem JOIN verwende nicht schon zuvor in der from Klausel verwenden.

                              Ist das so?

                              zumindest klappt es jetzt

                              wieso weiss ich zwar noch nicht so zu 100% aber es klappt zumindest

                              Danke!!!

                              Kommentar

                              Lädt...
                              X