Thomas: Mysql LEFT JOIN Spalte zeigt nur 0 an

Halle,

ich möchte 2 Tabellen miteinander verknüpfen. In beiden Tabellen ist der username vorhanden. Die kundennummer ist nur in userdb drin und den möchte ich auch in transactions drin haben.

Also lege ich kundennummer in transactions an und gebe den unten stehenden SQL Befehl ein. (ich mach das alles in phpMyAdmin) Dann wird mir die Zuordnung in einer kleinen Tabelle gezeigt und die stimmt auch. Aber und da kommt das Problem:
Laß ich mir alle Einträge der Tabelle transactions anzeigen, steht in dem Feld kundennummer immer nur eine 0.
Weiß jemand warum?

Die 2 Tabellen:

Tabelle userdb
--------------
kundennummer
username

Tabelle transactions
--------------------
username
kundennummer

SELECT userdb.kundennummer, userdb.username
FROM userdb
LEFT JOIN transactions ON transactions.kundennummer = userdb.kundennummer

  1. Hallo Thomas,

    Also lege ich kundennummer in transactions an

    [...]

    Laß ich mir alle Einträge der Tabelle transactions anzeigen, steht in dem Feld kundennummer immer nur eine 0.

    Hast Du daran gedacht, in der Tabelle "transactions" den Datensätzen einen Wert für das Feld "kundennummer" zuzuweisen?

    Es sieht so aus, als hättest Du bei dieser Spalte als Standardwert "0" für einen numerischen Datentyp verwendet.

    Freundliche Grüsse,

    Vinzenz

    1. Danke Vinzenz

      Also lege ich kundennummer in transactions an

      [...]

      Laß ich mir alle Einträge der Tabelle transactions anzeigen, steht in dem Feld kundennummer immer nur eine 0.

      Hast Du daran gedacht, in der Tabelle "transactions" den Datensätzen einen Wert für das Feld "kundennummer" zuzuweisen?

      Es sieht so aus, als hättest Du bei dieser Spalte als Standardwert "0" für einen numerischen Datentyp verwendet.

      Ja, ich habe das Feld kundennummer in der Tabelle transactions mit Typ int(5) und Null not null angelegt.

      Wenn ich in MyAdmin die Tabelle transactions angucke steht:
      Feld           Typ   Attribute   Null   Standard
      --------------------------------------------------------
      kundennummer   int(5)               Nein    0

      (die schon existierende kundennummer in userdb ist 5 Zeichen (50000) lang und wird mit auto_increment hochgezählt)

      Habe ich einfach nur das Feld falsch angelegt?

      1. Hallo Thomas,

        Hast Du daran gedacht, in der Tabelle "transactions" den Datensätzen einen Wert für das Feld "kundennummer" zuzuweisen?

        Feld           Typ   Attribute   Null   Standard

        kundennummer   int(5)               Nein    0

        So etwas habe ich mir gedacht.

        (die schon existierende kundennummer in userdb ist 5 Zeichen (50000) lang und wird mit auto_increment hochgezählt)

        Die wird intern schon größer werden dürfen :-)

        Habe ich einfach nur das Feld falsch angelegt?

        Nein. Feld und Felddatentyp sollten ok sein. Deine nächste Aufgabe ist es, jeder einzelnen Zeile den richtigen Wert in das Feld "kundennummer" zuzuweisen. Solange Deine 'username'-Werte eindeutig sind, geht das noch recht einfach. Wurde jedoch ein 'username' mehrfach vergeben, d.h. gibt es in Deiner "userdb" mehrere Einträge mit unterschiedlicher 'kundennummer' aber gleichem 'username', dann hast Du ein Problem.

        Ob ein Benutzername mehr als einmal vorkommt (und welche das sind) sollte Dir folgende (ungetestete) Abfrage liefern.

        SELECT
          username,
          COUNT(username) AS anzahl
        FROM
          userdb
        GROUP BY username
        ORDER BY anzahl DESC
        HAVING anzahl > 1

        Wenn kein 'username' in der Tabelle "userdb" doppelt vorkommt, dann kannst Du mit einer geschickt formulierten SQL-Anweisung die Einträge in Deiner Tabelle "transactions" vornehmen, falls Deine MySQL-Version mindestens 4.0.4 ist (siehe MySQL-Handbuch, UPDATE-Syntax, übrigens nur in der englischen Version, in der deutschen steht der Hinweis nicht drin).

        Freundliche Grüsse,

        Vinzenz

        1. Hallo,

          Die 'username'-Werte sind absolut eindeutig.
          Mysql-Version ist 4.0.18 und die ist ja nicht einfach mal so auf 4.0.4 upzudaten.
          Gibt es da keine andere Möglichkeit für einen schreib-es-rein-Befehl?

          Gruß
          Thomas

          1. Hallo Thomas,

            Die 'username'-Werte sind absolut eindeutig.

            Das ist in diesem Fall die erste gute Nachricht.

            Mysql-Version ist 4.0.18 und die ist ja nicht einfach mal so auf 4.0.4 upzudaten.

            Das ist die zweite gute Nachricht. 4.0.18 ist neuer als 4.0.4 (hm ja, nicht beim Stringvergleich :-)), somit steht dir die benötigte Funktionalität zur Verfügung.

            Deine Aufgabe besteht darin:
            Ändere Inhalte der Tabelle "transactions" unter Berücksichtigung der Tabelle "userdb".
            Setze den Inhalt in Spalte "username" auf den Wert der Spalte "username" der Tabelle "userdb", wobei zu beachten ist, dass die Werte in den Spalten "kundennummer" beider Tabellen gleich sind.

            Für das Ändern von Tabelleninhalten verwendest Du die UPDATE-Anweisung, siehe MySQL-Handbuch, UPDATE-Syntax. Ich zitiere aus referenzierten Handbuchartikel den für Dich relevanten Abschnitt:

            <zitat>
            Starting with MySQL 4.0.4, you can also perform UPDATE operations that cover multiple tables:

            UPDATE items,month SET items.price=month.price
            WHERE items.id=month.id;

            The example shows an inner join using the comma operator, but multiple-table UPDATE statements can use any type of join allowed in SELECT statements, such as LEFT JOIN.
            </zitat>

            Du musst eigentlich nur noch die angeführte Anweisung an Dein Problem anpassen.

            Freundliche Grüsse,

            Vinzenz

            1. Herzlichen Dank Vinzenz, es funktioniert.

              Das ist der Befehl:
              UPDATE transactions,userdb SET transactions.kundennummer=userdb.kundennummer
              WHERE userdb.username = transactions.username;

              Beste Grüße
              Thomas