paco: Mal wieder eine SQL-Join-Hirnverknotung..

Hallo Ihr!
folgendes Problem:
Für eine Benutzerverwaltung habe ich drei Tabellen, eine für die Nutzer, eine für die Gruppen und eine wo die jeweiligen ids als fremdschlüssel eingetragen werden

users

  • id + username
    +++++++++++++++
    +  1 + peter
    +  2 + paul
    +  3 + mary

groups

  • id + groupname
    ++++++++++++++++
    +  1 + admins
    +  2 + normalos
    +  3 + looser

users_groups

  • id + uid + gid
    ++++++++++++++++
  • 1  +  1  +  1
  • 2  +  1  +  2
  • 3  +  2  +  2
  • 4  +  3  +  2
  • 5  +  3  +  3

Um das zu pflegen möchte ich jetzt, bei ausgewählter Gruppe, in einer Schleife alle Usernamen ausgeben, mit jeweils einer Checkbox davor, die vorausgewählt ist, wenn der jeweilige User sich in der Gruppe befindet.

Also im Prinzip sowas:

$groupid = 2;

$sql="SELECT * FROM users";
$result = mysql_query($sql);
  while ($link = mysql_fetch_array($result)) {
    echo $link[username];
    echo *checkbox*;
     if(SELECT COUNT * FROM users-groups WHERE gid = $groupid AND uid = $link[id]) echo "checked=checked";
  }

Geht das grundsätzlich so? Hat jemand einen Rat wie die zweite Abfrage aussehen kann, bzw wie ich das mit einem Join hinbekomme? Oder gibt es eine noch schlauere Methode?

Dankeschööön,
Paco

  1. Tach!

    Also im Prinzip sowas:
    [...]
    Geht das grundsätzlich so?

    Im Prinzip ja, wobei dein Code aber noch nicht über die Gruppen iteriert. Es ist aber unschön, weil pro User und Gruppe eine eigene Query abgesetzt wird. Das kostet.

    Hat jemand einen Rat wie die zweite Abfrage aussehen kann, bzw wie ich das mit einem Join hinbekomme? Oder gibt es eine noch schlauere Methode?

    Ich nähme drei einfache, ungejointe Querys auf jede der Tabellen. Die Ergebnisse kommen erstmal in je ein Array. Das für die Zugehörigkeiten würde ich so aufbauen:

    $ug = array(
        uid1 => array(gid1 => id1, gid2 => id2),
        uid2 => array(gid2 => id3),
        uid3 => array(gid2 => id4, gid3 => id5)
      );

    Statt uidX, gidX und idX stehen da natürlich die Werte deiner users_groups-Tabelle. Das Beispiel orientiert sich an deinen Beispieldaten. Zum Ausgeben iterierst du über alle User und pro User jeweils über alle Gruppen. Dann kannst mit isset($ug[$user['id']][$group['id']]) ermitteln, ob der User in der Gruppe enthalten ist oder nicht. $user und $group sind die jeweiligen Laufvariablen der User- und der Gruppenschleife und enthalten damit einen User- beziehungsweise Gruppendatensatz. Die idX-Werte werden für die Frage nach der Mitgliedschaft nicht benötigt. Wenn du sie auch für andere Zwecke nicht benötigst, kannst du da auch true oder irgendwas anderes (außer null) nehmen.

    dedlfix.