Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Eine geteilte Mysql-Tabelle joinen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Eine geteilte Mysql-Tabelle joinen

    Guten Tag

    Habe mich wieder einmal in Mysql verstrickt.

    Meine Absicht ist es, eine Tabelle mit sich selbst zu vergleichen und von dort nur solche Daten abzurufen, welche in einer zweiten Tabelle keine Einträge von der ersten Tabelle haben. Wahrscheinlich lässt der nachfolgende – nicht funktionierende Code – deutlicher erkennen, was ich meine.

    PHP-Code:
    <?
    $sql = "SELECT 
    t1.id AS t1_id,  t2.id AS t2_id
    FROM kunden AS t1,  kunden AS t2
    LEFT JOIN vorschlag as t3
    ON t1.id = t3.Sid
    LEFT JOIN vorschlag as t4
    ON t2.id = t4.Fid
    WHERE
    t3.Sid IS NULL and
    t4Fid IS NULL and
    ……“;
    $res= mysql_query($sql);echo mysql_error();
    $Anzahl1= mysql_num_rows ($res);
    ?>
    Fehlermeldung:
    Unknown column 't1.id' in 'on clause'

    Wie bringe ich Mysql bloß bei, dass es die Aliasnamen erkennt ?

    Zwecks Klarheit: Es sollen keine Datensätze ausgegeben werden, wenn die Datenfelder eines Datensatzes von 'vorschlag' (Sid,Fid) mit je einem Wert der Tabelle 'kunden' (id) besetzt sind.

  • #2
    Zitat von MrVienna Beitrag anzeigen
    [php]t4Fid IS NULL;
    Da fehlt ein Punkt

    Zitat von MrVienna Beitrag anzeigen
    PHP-Code:
    $resmysql_query($sql);echo  mysql_error(); 
    Sollte eher so heißen:
    PHP-Code:
    if (false === ($res mysql_query($sql)) {
        die(
    mysql_error());

    Das mit den aliasnamen sollte eigentlich kein Problem sein.
    "My software never has bugs, it just develops random features."
    "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

    Kommentar


    • #3
      Danke für die Aufmerksamkeit.
      Der Fehler ist im Originalcode nicht enthalten, der ist mir beim Übertragen passiert. Und die Fehlermeldung bezieht sich gleich auf den ersten Aliasnamen. (t1.id)

      Danke auch für den Hinweis:

      if (false === ($res = mysql_query($sql)) {
      die(mysql_error());
      }

      Kommentar


      • #4
        Ich denke, dass liegt daran, dass es an diesem Teil liegt:
        Code:
        FROM kunden AS t1,  kunden AS t2
        LEFT JOIN vorschlag as t3
        ON t1.id = t3.Sid
        Der fett markierte Teil wird wohl ausgeführt bzw. verknüpft und da kennt er t1.id nicht. Ist aber nur eine Vermutung. Jedenfalls würde ich den erste implizieten JOIN auch ausschreiben.
        [I]Es ist schon alles gesagt! Nur noch nicht von allen! (Karl Valentin)[/I]
        [I]Wenn du eine weise Antwort verlangst, musst du vernünftig fragen. (Johann Wolfgang von Goethe)[/I]

        Kommentar


        • #5
          So ist es, es hängt an dieser Zeile

          Code:
          ON t1.id = t3.Sid
          Aber ich kann ja auch nicht schreiben:

          Code:
          ON kunden.t1.id = t3.Sid
          Wenn ich so abfrage:

          Code:
          ON id = t3.Sid
          dann funktioniert es, aber nicht sinngemäß. Es werden auch Datensätze zurückgehalten, wenn auch nur ein Eintrag gefunden wird und nicht beide.

          Kommentar


          • #6
            sach was willst du denn genau machen? Geht sowas nicht?
            PHP-Code:
            <?
            $sql = "SELECT t1.id AS t1_id
            FROM kunden AS t1
            LEFT JOIN vorschlag as t2 ON t1.id = t2.Sid
            LEFT JOIN vorschlag as t3 ON t1.id = t3.Fid
            WHERE t2.Sid IS NULL and t3.Fid IS NULL and
            ……“;
            "My software never has bugs, it just develops random features."
            "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

            Kommentar


            • #7
              Werde es gleich probieren.

              Kommentar


              • #8
                Habe es jetzt so versucht. Ich muss die kunden-Tabelle auch teilen, weil in einer weiteren Abfrage verschiedene Id's herausgesucht werden.

                PHP-Code:
                <?
                $sql = "SELECT t1.id AS t1_id, t2.id AS t2_id
                FROM  kunden  AS  t1, kunden AS  t2
                LEFT JOIN vorschlag as t3 ON t1.id = t3.Sid
                LEFT JOIN vorschlag as t4 ON t2.id = t4.Fid
                WHERE t3.Sid IS NULL and t4.Fid IS NULL and
                ……..”;
                ?>
                Leider wieder die gleiche Fehlermeldung:
                Unknown column 't1.id' in 'on clause'

                Kommentar


                • #9
                  Kannst du vielleicht das gesamte SQL posten und dann genau erklären was du machen möchtest.

                  OT:
                  Außerdem ist das eher eine Frage für Datenbank Forum denke ich
                  "My software never has bugs, it just develops random features."
                  "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                  Kommentar


                  • #10
                    Nun, ich will versuchen, es kurz zu machen. Denn der gesamte Code umfasst schon eine Menge Platz.

                    Also in einer vorhergehenden Abfrage werden aus einer Tabelle Käufer und Verkäufer abgerufen.

                    In der nächsten Abfrage - um die es eben geht - wird sortiert, welcher Käufer für welchen Verkäufer in Frage kommt - funktioniert alles. An die Käufer werden Warenvorschläge verschickt und dabei wird in der Tabelle 'vorschlag' ein Eintrag gemacht, der die id sowohl des Anbieters, als auch des eventuellen Kunden enthält.

                    Deswegen sollen die id's, die bereits einen Eintrag in der Tabelle 'vorschlag' enthalten, nicht noch einmal angeschrieben werden.

                    Ich möchte also aus der Tabelle 'kunden' nur Datensätze erhalten, deren Id's noch nicht in der Tabelle 'vorschlag' enthalten ist.

                    Und das scheitert daran, dass der erste Aliasname nicht erkannt wird.

                    Es ist richtig, im Datenbank-Forum wäre ich besser aufgehoben. Aber kann ich jetzt noch dort die Frage stellen, ohne dass das als Doppelposting verstanden wird ?

                    Kommentar


                    • #11
                      Nein, Du sollst gleicht darauf achten!
                      Habe mich wieder einmal in Mysql verstrickt.
                      zeigt ja wohl, dass Du weißt, welche Technologie hier relevant ist.


                      [MOD: verschoben]
                      [COLOR="#F5F5FF"]--[/COLOR]
                      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                      [COLOR="#F5F5FF"]
                      --[/COLOR]

                      Kommentar


                      • #12
                        Das Hauptproblem ist, dass hier Theta-Join-Technik und ANSI-JOIN-Technik gemischt wird. Deshalb habe ich den SQL etwas umformuliert und erst einmal die Alias in der SELECT-Klausel entfernt.

                        Code:
                        SELECT t1.id , t2.id 
                        FROM   kunden AS t1
                               JOIN kunden AS t2
                                 ON t1.id = t2.id
                               LEFT JOIN vorschlag AS t3
                                 ON t1.id = t3.sid
                               LEFT JOIN vorschlag AS t4
                                 ON t2.id = t4.fid
                        WHERE  t3.sid IS NULL
                               AND t4.fid IS NULL  
                               AND .....
                        Die Spalten des fett markierten JOIN habe ich geraten, ich denke Du weißt besser als ich, welche Spalte den JOIN bilden muß.

                        EDIT

                        Desweiteren ist die Abfrage seltsam, wenn ich mir die IS NULL Bedingung von t4.fid anschaue und t4.fid als JOIN Bedingung existiert, denn NULL = NULL ist FALSE.

                        Code:
                        ...
                              LEFT JOIN vorschlag AS t4
                                 ON t2.id = t4.fid
                        WHERE  t3.sid IS NULL
                               AND t4.fid IS NULL  
                        ...
                        Grüße
                        Thomas

                        Kommentar


                        • #13
                          Hallo thomas_w

                          Danke für Deinen Rat.

                          Habe Deinen Code ausprobiert, bekomme aber wieder die altbekannte Fehlermeldung: Unknown column 't1.id' in 'on clause'

                          Die Ursache habe ich inzwischen hier gefunden, es geht um die Einklammerung:

                          MySQL :: MySQL 5.1 Referenzhandbuch :: 13.2.7.1 JOIN

                          Nur wusste ich nicht, wie ich verlangten Klammern bei Deinem Code am besten anbringe. Nun bin ich bis jetzt so weit gekommen:

                          PHP-Code:
                          <?
                          FROM (kunden AS t1, kunden AS t2)
                          LEFT JOIN vorschlag as t3 ON (t1.id = t3.Sid)
                          LEFT JOIN vorschlag as t4 ON (t2.id = t4.Fid)
                          WHERE
                          t3.Sid IS NULL and t4.Fid IS NULL and
                          ...?>
                          So funktioniert es zwar, aber noch nicht wunschgemäß. Ich wollte, dass nur Datensätze aussortiert werden, die in einem Datensatz von 'vorschlag' die Werte t1 und t2 enthalten. Es werden aber auch Datensätze aussortiert, wo nur einer von den beiden Werten (t1 oder t2) gefunden werden.

                          Ich denke, ich muss dem Programm beibringen, dass t3 und t4 auch die gleiche ID der Tabelle 'vorschlag' haben muss. Über die Formulierung des Befehls befinde ich mich noch im Zielfindungsstadium. Für einen Rat wäre ich sehr dankbar.

                          Grüße MrVienna

                          Kommentar


                          • #14
                            Also ich habe so getestet und mein SQL läuft fehlerfrei durch... (MySQL 5.1.44)

                            Code:
                            CREATE TABLE kunden (
                             id INT NOT NULL
                            );
                            
                            INSERT INTO kunden VALUES 
                            ( 1), (2);
                            
                            CREATE TABLE vorschlag (
                             id INT NOT NULL,
                             sid INT,
                             fid INT
                            );
                            
                            INSERT INTO vorschlag VALUES 
                            ( 1, 2, 3), (2, 3, NULL );
                            
                            SELECT t1.id , t2.id 
                              FROM kunden AS t1
                              JOIN kunden AS t2
                                ON t1.id = t2.id
                              LEFT JOIN vorschlag AS t3
                                ON t1.id = t3.sid
                              LEFT JOIN vorschlag AS t4
                                ON t2.id = t4.fid
                            WHERE  t3.sid IS NULL
                              AND t4.fid IS NULL;
                            
                            
                            mysql> SELECT t1.id , t2.id
                                ->   FROM kunden AS t1
                                ->   JOIN kunden AS t2
                                ->     ON t1.id = t2.id
                                ->   LEFT JOIN vorschlag AS t3
                                ->     ON t1.id = t3.sid
                                ->   LEFT JOIN vorschlag AS t4
                                ->     ON t2.id = t4.fid
                                -> WHERE  t3.sid IS NULL
                                ->   AND t4.fid IS NULL;
                            Empty set (0.00 sec)
                            
                            mysql>
                            Er findet zwar keine passenden Daten, aber die Abfrage läuft fehlerfrei.
                            Es wäre vielleicht am Besten, wenn Du ein paar Testdaten mit den echten CREATE TABLE plus dem kompletten SQL zeigst.

                            Grüße
                            Thomas

                            Kommentar


                            • #15
                              Hallo Thomas

                              Leider komme ich erst jetzt dazu, mich für Deine Mühe zu bedanken.

                              Vermutlich liegt es an der Select-Syntax, dass mir Dein Code keine Ausgabe liefert.

                              Dein Select:
                              Code:
                              SELECT t1.id , t2.id
                              Und meines:
                              Code:
                               SELECT
                               t1.id AS t1_id,
                               t2.id AS t2_id,
                               t1.LetzterLoginBeginn AS t1_LetzterLoginBeginn,
                               t2.LetzterLoginBeginn AS t2_LetzterLoginBeginn,
                               ...
                              Aber nachdem das eine ziemliche Liste ist, bin ich noch nicht dazugekommen, alles umzuschreiben.

                              An sich würde es ja schon funktionieren, bis auf den Umstand, dass ich es noch nicht schaffe, die beiden Werte (t3.Sid, t4.Fid) mit der Datensatz-ID der Tabelle 'vorschlag' zu verbinden. Es soll also nur der Datensatz angesprochen werden, wo beide Werte vorkommen und kein Datensatz, wo nur einer der beiden Werte vorhanden ist.

                              Mein erster Versuch:

                              Code:
                              WHERE
                              t3.Vid = t4.Vid and               // Vid ist die Datensatz-Nummer von vorschlag
                              t3.Sid IS NULL and t4.Fid IS NULL and
                              ...
                              funktioniert zunächst einmal nicht.

                              Kommentar

                              Lädt...
                              X