Fabian H.: (MySQL) Tabellen verknüpfen mit UPDATE?

Hi
Ich habe zwei Tabellen, users und groups.
In der Tabelle users sind, wie der Name schon sagt, verschiedene Benutzer mit ihren Daten abgelegt. Jeder Benutzer kann Mitglied in einer Gruppe der Tabelle groups sein. Nun hat jede Gruppe einen Admin, der in der Spalte "admin" der Tabelle groups gespeichert wird. Jetzt möchte ich von Zeit zu Zeit ein mysql-Befehl ausführen lassen, der bei allen Benutzern, die Gruppenadmin sind, die Spalte "groupadmin" der Tabelle users auf 1 setzt. Das Ganze darf nur ein Befehl sein...

Tabelle users:
name        varchar(50)
group       varchar(20)
groupadmin  int(1)

Tabelle groups:
name        varchar(20)
admin       varchar(50)

Mein erster Versuch war wie folgt:

UPDATE users SET users.groupadmin = 1 WHERE users.name = groups.admin AND users.group = groups.name;

Doch das geht nicht: Unknown table 'groups' in where clause

Kann mir jemand helfen oder geht das mit UPDATE gar nicht?

Gruss Fabian

  1. Hallo,

    Ich habe zwei Tabellen, users und groups.
    In der Tabelle users sind, wie der Name schon sagt, verschiedene Benutzer mit ihren Daten abgelegt. Jeder Benutzer kann Mitglied in einer Gruppe der Tabelle groups sein. Nun hat jede Gruppe einen Admin, der in der Spalte "admin" der Tabelle groups gespeichert wird. Jetzt möchte ich von Zeit zu Zeit ein mysql-Befehl ausführen lassen, der bei allen Benutzern, die Gruppenadmin sind, die Spalte "groupadmin" der Tabelle users auf 1 setzt. Das Ganze darf nur ein Befehl sein...

    Tabelle users:
    name        varchar(50)
    group       varchar(20)
    groupadmin  int(1)

    Tabelle groups:
    name        varchar(20)
    admin       varchar(50)

    UPDATE groups INNER JOIN users ON groups.name = users.group SET users.groupadmin = 1 WHERE users.name = groups.admin;

    Von der Logik her sollte:

    UPDATE users INNER JOIN groups ON users.name = groups.admin SET users.groupadmin = 1;

    auch funktionieren.

    Aber warum machst Du das nicht gleich, wenn Du festlegst, wer Admin sein soll? Irgendwann muss Du doch mal den Admin-Namen in die Tabelle groups schreiben.

    Noch günstiger wäre, statt des Admin-Namens einen numerischen Schlüssel aus der Tabelle users in der Tabelle groups zu speichern.

    Tabelle users:

    id          int(x)---------+

    name        varchar(50)    |
    group       varchar(20)    |
                               |
    Tabelle groups:            |
    name        varchar(20)    |

    admin       int (x)--------+

    Wer Admin in welcher Gruppe ist, bekommst Du dann mit:

    SELECT groups.name, users.name AS admin FROM users INNER JOIN groups ON users.id = groups.admin

    viele Grüße

    Axel

    1. Danke vielmals jetzt funktioniert es :)

      Das mit der ID ist auch ne gute Idee, bei der nächsten Überarbeitung werde ich das so machen!

      Gruss Fabian

      1. Mhh, irgendwie geht es doch noch nicht:

        Fehler

        SQL-Befehl :

        UPDATE groups INNER JOIN users ON groups.name = users.group SET users.groupadmin = 1 WHERE users.name = groups.admin

        MySQL meldet:

        You have an error in your SQL syntax near 'INNER  JOIN users ON groups.name = users.group SET users.groupadmin = 1 WHERE ' at line 1

        mach ich was falsch?

        Gruss Fabian

        1. Hallo,

          Fehler
          SQL-Befehl :
          UPDATE groups INNER JOIN users ON groups.name = users.group SET users.groupadmin = 1 WHERE users.name = groups.admin
          MySQL meldet:
          You have an error in your SQL syntax near 'INNER  JOIN users ON groups.name = users.group SET users.groupadmin = 1 WHERE ' at line 1

          Welche MySQL-Version hast Du? Update mit mehreren Tabellen kann MySQL erst seit 4.0.4.
          http://dev.mysql.com/doc/mysql/en/UPDATE.html

          Wenn Du eine 4.0.4 oder höher hast, der Fehler aber trotzdem kommt, dann probier mal MySQLs komische INNER JOIN-Syntax:

          UPDATE users, groups SET users.groupadmin = 1 WHERE groups.name = users.group AND users.name = groups.admin

          viele Grüße

          Axel