Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] SQL INNER JOIN immer falsch deklariert, bitte um Anfänger Hilfe.

Einklappen

Neue Werbung 2019

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

  • [Erledigt] SQL INNER JOIN immer falsch deklariert, bitte um Anfänger Hilfe.

    Guten Morgen,

    ich hantiere jetzt seit 1 Stunde mit dieser SQL um in der Tabelle copy die doppelten Werte anzuzeigen. php maydmin gibt mir einen Fehler nach dem anderen aus. Jetzt erkennt er die Spalte "a.Titel" nicht mehr. Ich möchte die Titel vergleichen und die Datensätze ausgeben, wenn die IDs = pk_copy unterschiedlich sind .
    Code:
    SELECT a.pk_copy, a.Titel, a.plz, b.pk_copy, b.Titel, b.plz 
    FROM  copy a, copy b
    JOIN copy  b1 ON  a.Titel = b1.Titel 
    JOIN copy  b2 ON  a.pk_copy = b2.pk_copy
    WHERE NOT (a.pk_copy = b2.pk_copy ) AND a.Titel = b1.Titel;
    Der Fehlercode ist: #1054 - Unknown column 'a.Titel' in 'on clause'
    Sieht da jemand meinen Fehler und könnte mir sagen, was ich da falsch mache bitte?

    Danke schön vorab,

    maen

  • #2
    wo ist die Beziehung zwischen a und b ?
    deine Joins sehen etwas verworren aus

    außerdem widerspricht sich dein JOIN b2 mit der Where-Bedingung ...
    du müsstest also LEFT JOIN anstelle von INNER JOIN verwenden

    und deine Bedingung für den JOIN b1 musst du im WHERE-Teil nicht wiederholen ...

    vielleicht stellst du erstmal klar, was du überhaupt erreichen willst ?!

    bitte verwende explizite Alias-Zuweisung mit "AS"

    Kommentar


    • #3
      OK: Ich will in der Tabelle copy die doppelten Einträge, die sich durch den primary key pk_copy unterscheiden, aber den gleichen Titel haben, löschen. Da das ganze öfter vorkommen kann, wegen der Dateneinspeisung, will ich das als ausführbares php Skript haben. Ich habe letzte Nacht herumgedoktert und eine doppelte while Schleife geschrieben mit DB Abfragen, musste mich aber im Forum hier eines besseren belehren lassen dass man das mit joins zu lösen habe und dies ein NO-Go wäre.
      Somit versuche ich jetzt nach der Anleitung hier meinen ersten inner Join zu bauen. Vielen Dank für deine Mühe!

      PS. Da kommen noch mehr Spalten, aber ich will erst mal diese testen. Ich werde in der join Anweisung schon mal das pk_copy durch plz ersetzen.

      Kommentar


      • #4
        dann fang doch erstmal an, genau das zu programmieren, was du im Text schreibst

        Code:
        SELECT a.pk_copy, a.Titel, a.plz, b.pk_copy, b.Titel, b.plz
        FROM copy AS a
        LEFT JOIN copy AS b
        ON ( (a.pk_copy!=b.pk_copy) AND (a.Titel=b.Titel) )
        natürlich bekommst du jetzt jedes "Paar" 2 mal angezeigt und eine 3fache Wiederholung auch 3 mal ...

        Kommentar


        • #5
          Wozu das "copy b"? Für die Beziehung definierst du nirgendwo eine Bedingung.

          Ein Join auf den Titel reicht auch, du musst hinterher nur prüfen ob der Join ein Ergebnis hatte.
          Code:
             SELECT a.id
             FROM copy a
             LEFT JOIN copy b ON a.titel = b.titel AND a.id != b.id 
             WHERE b.id IS NOT NULL
          Das ganze als Subselect im Delete:
          Code:
          DELETE FROM copy
          WHERE id IN (
             SELECT a.id
             FROM copy a
             LEFT JOIN copy b ON a.titel = b.titel AND a.id != b.id 
             WHERE b.id IS NOT NULL 
          )

          Kommentar


          • #6
            @eagle273

            Zitat von eagle275 Beitrag anzeigen
            dann fang doch erstmal an, genau das zu programmieren, was du im Text schreibst

            Code:
            SELECT a.pk_copy, a.Titel, a.plz, b.pk_copy, b.Titel, b.plz
            FROM copy AS a
            LEFT JOIN copy AS b
            ON ( (a.pk_copy!=b.pk_copy) AND (a.Titel=b.Titel) )
            natürlich bekommst du jetzt jedes "Paar" 2 mal angezeigt und eine 3fache Wiederholung auch 3 mal ...
            Wenn ich Deinen Code in den phpmyadmin poste, dann wird aus bestehenden 1182 Datensätzen eine Ausgabe von 1185 Datensätze gemacht!??? Aber immerhn motzt jetzt der phpmyadmin nicht mehr wegen "a.Title" rum. Darauf kann ich aufbauen. Das andere schau ich mir jetzt an! Danke schon mal!

            Kommentar


            • #7
              So, wenn ich jetzt folgenden Code ausführe, erhalte ich alle doppelten bzw. mehrfachen Datensätze. Das klappt also schon mal:
              Code:
              SELECT DISTINCT a.pk_copy, a.Titel, a.plz, a.Gericht, a.copy_trigger, b.pk_copy, b.Titel, b.plz, b.Gericht, b.copy_trigger FROM copy AS a LEFT JOIN copy AS b ON ( NOT (a.pk_copy = b.pk_copy) AND (a.Titel = b.Titel) AND a.plz = b.plz AND a.Gericht = b.Gericht)WHERE a.pk_copy != b.pk_copy
              Jetzt möchte ich nicht alle löschen sondern den doppelten einen Trigger mitgeben mittels Update SET. Dafür habe ich die doppelten in einer while-Schleife ausgegeben und versuche nun den Trigger auf 1 zu setzen. Aber: Die while Schleife bricht nach dem ersten Durchlauf ab!

              PHP-Code:
              while ($daten mysql_fetch_array($db_ergMYSQL_ASSOC)) {
                  echo 
              "<pre> Data: ";
                  
              print_r($daten);
                  echo 
              "</pre>"
                  
              $id $daten[pk_copy];
                  
              $titel $daten[Titel];
                  
              $sql_update "UPDATE copy SET ";
                  
              $sql_update .="b.copy_trigger = 1"
                  
              $sql_update .= " WHERE pk_copy ='" $id "'";
                  echo 
              "<hr />SQL: $sql_update<hr />";
                  
              $db_erg mysql_query($sql_update);
                   } 
              Weiß einer was ich mit dieser Schleife falsch mache???

              Danke schön vorab!

              Kommentar


              • #8
                DU führst eine Query in einer Schleife aus. Das ist schon mal unnötig.
                Du benutzt Arrayschlüssel ohne Stringbegrenzer
                Du verwendest kein PHP-Errorhandling
                Du benutzt keine SQL-Fehlerabfrage

                Kommentar


                • #9
                  Zitat von maen007 Beitrag anzeigen
                  Weiß einer was ich mit dieser Schleife falsch mache???

                  Danke schön vorab!
                  nikosch hat schon einiges angemerkt. Du kannst auch ohne Schleife den Update Befehl ausführen. Dieser kennt nämlich ebenso wie Select den Join-Teil.

                  Dein Problem liegt darin das du $db_erg am Schleifenende überschreibst. Womit mysql_fetch_assoc im Schleifenkopf natürlich nichts mehr fetchen kann.

                  Hättest du die PHP Fehlerausgabe aktiviert, würde das auch eine Warning werfen, da du keine gültige Ressource übergibst (Update Befehle liefern nur true/false).

                  Kommentar


                  • #10
                    Bitte um weitere Unterweisung ....

                    So, erst mal Danke an Euch alle! Wo fang ich an?
                    also zu Nikosch: Wenn Du mit mir fertig bist, habe ich ein Programmierstudium hinter mir. Bis ich deine Anweisungen verstanden habe, vergeht immer einige Zeit, aber ich lerne was, das steht fest! Danke dafür.
                    Zu deinen Anweisungen: Das habe ich immer noch nicht gerafft mit dem Query in der Schleife. Ich habe das in 1000 Tutorials so gesehen. Erst als Dark Guardian mir das mit dem Überschreiben erklärt hat, hats bei mir geklickt! Anwenden kann ich es noch nicht, aber kommt Zeit ...
                    Ebenfalls das mit dem Stringbegrenzer. Erst mal muss ich sagen, ich lerne hier wie die Affen: Imitation. Heißt ich nehme mir was ähliches, versuche das zu verstehen, und teste das dann. Was ein Stringbegrenzer ist habe ich ebenfalls noch nicht rausgefunden. Aber auch hier werde ich mit Geduld weiter suchen.
                    Das mit dem PHP Errorhandling habe ich jetzt mal aktiviert. Das ist cool. Da wurde mir direkt mal der von Dark_Guardian angeführte Überschreibungswirrwarr ausgegeben. Somit kann ich das bestätigen. Hast Du sicher von mir gebrauch Dark_guardian, so eine Bestätigug von mir
                    Zur SQL-Fehlerabfrage: Ist nu drin, seitdem ich weiß was das soll! Mein Code sieht demnach immo so aus, nur noch der untere Teil:
                    PHP-Code:
                    while ($daten mysql_fetch_array($db_ergMYSQL_ASSOC)) {
                     if (!
                    $daten) {
                        die(
                    'Ungültige Abfrage: ' mysql_error());
                    }
                        echo 
                    "<pre> Data: ";
                        
                    print_r($daten);
                        echo 
                    "</pre>"
                        
                    $id $daten[pk_copy];
                        
                    $titel $daten[Titel];
                        
                    $gericht $daten[Gericht];
                        
                    $plz $daten[plz];
                        
                    $sql_update "UPDATE copy SET ";
                        
                    $sql_update .="copy_trigger = 1"
                        
                    $sql_update .= " WHERE pk_copy ='" $id "'";
                        
                    //  $sql_update .= " AND NOT (pk_copy ='" . mysql_real_escape_string($daten_update_id) . "')";
                        //$sql_update .= "WHERE pk_copy ='" . $daten_['pk_copy'] . "'";
                        
                    echo "<hr />SQL: $sql_update<hr />";
                        
                    $db_erg1 mysql_query($sql_update)or die(mysql_error() . $sql);
                          } 
                    Problem: Jetzt haue ich jedem doppelten einen Trigger mit 1 rein! Ich wollte aber nur 1 der doppelten einen mitgeben. Schätze mal liegt an der Update Methodik. Könnte ich noch untertänigst um Unterweisung zu diesem Problem bitten?

                    Danke! maen

                    Kommentar


                    • #11
                      Zitat von maen007 Beitrag anzeigen
                      Zu deinen Anweisungen: Das habe ich immer noch nicht gerafft mit dem Query in der Schleife. Ich habe das in 1000 Tutorials so gesehen.
                      Das ist leider ein Fehler vieler Tutorials. Denn was dein Query in der Schleife macht, das macht eben der Join einer jeden SQL Datenbank.

                      Code:
                      UPDATE 
                          copy AS a 
                          LEFT JOIN copy AS b 
                             ON ( NOT (a.pk_copy = b.pk_copy) AND (a.Titel = b.Titel) AND a.plz = b.plz AND a.Gericht = b.Gericht)
                      SET
                         a.trigger = 1
                      WHERE a.pk_copy != b.pk_copy
                      Keine Schleife, keine 1000 Queries welche du an die DB abfeuerst.

                      Zitat von maen007 Beitrag anzeigen
                      Ebenfalls das mit dem Stringbegrenzer. Was ein Stringbegrenzer ist habe ich ebenfalls noch nicht rausgefunden.
                      PHP-Code:
                      $string 'string'
                      ' und " sind gemeint. Array-Keys welche keine Zahlen sind werden damit angegeben. Ansonsten wertet PHP diese als Konstanten. Stell deine neu gefundene Fehlerbehandlung mal auf E_ALL, dnan siehst du die Notices für "undefined constant".

                      Kommentar


                      • #12
                        OK, DAS ist mit den Stringbegrenzern gemeint! Mein lieber Schwan, und ich google ne halbe Stunde am Stück nach "Array while Stringbegrenzer"! Wer zahlt die mir zurück ???? Danke schon wieder!

                        Kommentar


                        • #13
                          und ich google ne halbe Stunde am Stück nach "Array while Stringbegrenzer"!
                          Würdest Du richtig googlen, fändest Du auch was. Ich schreibe wohl kaum
                          Arrayschlüssel ohne Stringbegrenzer
                          wenn ich „Array while Stringbegrenzer“ meine.

                          Kommentar


                          • #14
                            @ nikosch

                            Mea CULPA, mea maxima culpa!

                            Aber:

                            Der UPDATE Code ergibt dass alle Datensätze mit Trigger = 1 ausstaffiert werden.

                            Wenn ich mir die SELECT Anweisung im phpmyadmin anzeigen lasse, dann zeigt er mir in der Join Tabelle auch alle Datensätze auf beiden Seiten an. Jeweils mit der entsprechenden Dublette auf der anderen Seite! Hat sich auch nicht geändert, als ich noch ein DISTINCT davor gesetzt hatte...

                            Ich will aber nur den überflüssigen Datensatz haben.

                            Kommentar


                            • #15
                              Zitat von maen007 Beitrag anzeigen
                              Der UPDATE Code ergibt dass alle Datensätze mit Trigger = 1 ausstaffiert werden.
                              Etwas Mitarbeit wäre schön.

                              Der Update verwendet einen LEFT JOIN, d.h. die linke Seite ist immer komplett (copy a), da ich die SET Anweisung auf a.trigger gesetzt habe, was wird wohl passieren wenn die Tabelle "a" komplett im Ergebnis liegt?

                              Wenn du das logisch nachvollziehen kannst gibt es 3 logische Lösungsmöglichkeiten:
                              - Auf einen INNER JOIN wechseln
                              - Alles was b.id "null" hat per WHERE-Klausel rauswerfen
                              - Die SET Anweisung auf b.trigger stellen (könnte zu Fehlern führen wnen kein Join aufgebaut wurde, weiß ich gerade nicht genau)

                              Kommentar

                              Lädt...
                              X