dedlfix: Datenbankabfrage über mehrere Tabellen

Beitrag lesen

echo $begrueszung;

Wäre das dann mit der einen Tabelle, wie ich es als ansatz unten erwähnt habe die sinvollste lösung?

Der Drei-Tabellen-Ansatz ist schon der sinnvollste. Was du hast ist ja kein Datenbank-Problem sondern eher ein Darstellungsproblem.

Die Anzahl der Ergebnisspalten ist in MySQL durch deine SELECT-Klausel (*, Aufzählung der Feldnamen, berechnete Spalten, ... (noch mehr?)) festgelegt. Beim Hinzukommen oder Wegfallen von Gruppen müsstest du dir immer die SELECT-Klausel anpassen.

Du hast ja PHP, damit geht es beispielsweise so (du willst das Ergebnis doch sicher mit HTML darstellen):

Für die Ermittlung der Spalten der HTML-Tabelle wird einmalig die DB-Tabelle groups abgefragt. Das Ergebnis kommt ein ein Array, dass am Ende so aussieht:

$groups = array('groupName1', 'groupName2', ...);

Dann wird der Inhalt der DB-Tabelle security benötigt. Der kann unsortiert oder nach userName sortiert aus der DB gelesen weden.

Das folgende ist als Quelltext einfacher zu beschreiben als in Worten:

  
  $users = array();  
  while ($row = mysql_fetch_assoc(...))  
    $users[$row['userName']][$row['groupName']] = 1; // [1]  

Damit ist in $users eine Art Matrix entstanden. Das sieht dann so aus:

$users = array(
    'userName1' => array('groupName1' => 1, 'groupName2' => 2),
    'userName2' => array('groupName2' => 1),
    'userName3' => array('groupName1' => 1),
    ...);

Zur Ausgabe kann man nun über $users foreach-en und darin jeweils über $groups foreach-en und testen, ob ein entsprechendes Element in $users gibt:

foreach($users as $name => $userGroups) {
  ...
  echo $name;
  ...
  foreach($groups as $groupName) {
    ...
    echo isset($userGroups[$groupName])) ? 'X' : ''; // [2]
    ...
  }
  ...
}

Anstelle der ... kommen die HTML-Tabs des Tabellenrumpfs. Der Kopf kann vorher ebenfalls mit einem foreach über $groups angezeigt werden.

Soweit so klar?

Alternativ könnte man:

[1]  $users[$row['userName']][] = [$row['groupName']];
[2]  echo in_array($groupName, $userGroups) ? 'X' : '';

verwenden. Das in_array() ist allerdings langsamer als die Abfrage der gesetzten Schlüssel, hab ich die Tage erst hier in einem anderen Thread gelesen.

Diese Lösung hat momentan allerdings einen kleinen Makel. User, die in keiner Gruppe sind, werden nicht angezeigt. Aber das kann man mit geringem Aufwand auch noch einfügen.

echo "$verabschiedung $name";