MySQL-Abfrage von Tabellen mit Ausschluss von Werten

qsrs

Erfahrenes Mitglied
Hallo,

ich habe ein PHP-Skript geschrieben, das u.a. auch Benutzer und Gruppen verwaltet. Kurz zusammengefasst habe ich eine Tabelle, in welcher die Benutzer gespeichert werden, und eine, in der die IDs der Benutzer mit der ID der Gruppe gespeichert werden, in die sie gehören, und eine weitere Tabelle, in welchen die Gruppenfunktionen einer Gruppe gespeichert werden.

Die Tabelle der User sieht etwa so aus (gekürzt):

id | user_name |
1 | test1 |
2 | test2 |

Die Tabelle der Mitglieder sieht so aus:

id | user_id | user_group_id |
1 | 1 | 5 |
2 | 2 | 5 |

(user_group_id speichert die ID der Gruppe aus der Tabelle, in welcher die Funktionen definiert sind)

Nun möchte ich die Gruppen auch pflegen. Dazu lasse ich mir u.a. auch alle Benutzer der zu bearbeitenden Gruppe ausgeben, um neue Benutzer hinzuzufügen bzw. alte zu löschen. Ich benötige also zwei Abfragen, und hier liegen mein Problem und die Frage:

Wie kann ich nur die Benutzer abfragen, die zur Gruppe gehören, die ich gerade bearbeite (z.B mit der id 5) und eine weitere Abfrage mit allen, die nicht in zur Gruppe mit der ID 5 gehören? Die Abfrage betrifft ja dann zwei Tabellen, und hier weiß ich Moment nicht weiter.

Würde mich über Hilfe sehr freuen. Vielen Dank für evtl. Antworten.
 
Hallo,

jetzt habe ich ein kleines Problem mit einer Abfrage. Wie erwähnt verwende ich folgende Tabellen:

Die Tabelle der User sieht etwa so aus (gekürzt):

id | user_name |
1 | test1 |
2 | test2 |
3 | test3 |
4 | test4 |

Die Tabelle der Mitglieder sieht so aus:

id | user_id | user_group_id |
1 | 1 | 5 |
2 | 2 | 5 |
3 | 3 | 6 |
4 | 4 | 6 |

Nun möchte ich in einem Textfeld alle User ausgeben, die nicht in der Gruppe sind, die ich gerade bearbeite, das mache ich so:

SELECT tabelle_user.user_name FROM tabelle_user, tabelle_members WHERE tabelle_members.user_id != tabelle_user.id AND tabelle_members.user_group_id = '$id' ORDER BY tabelle_user.user_name ASC

In $id steht die ID der Gruppe, die ich gerade bearbeite (also user_group_id). Ich erhalte mit dieser Abfrage aber nicht die gewünschten Ergebnisse. Es werden mir alle Mitglieder zweimal angezeigt, bis auf die User, die in der zu bearbeitenden Gruppe sind (die eigentlich nicht angezeigt werden sollen) - diese erscheinen jeweils einmal. Was mache ich falsch? Mit INNER JOIN habe ich es auch schon versucht - selbes Ergebnis. Danke für evtl. Antworten.
 
Hallo qsrs,

In deiner Lösung ist ein falscher Join drin.

Eine mögliche Lösung könnte z.B. wie folgt lauten.

SQL:
select tabelle_user.user_name 
   from tabelle_user
  where tabelle_user.id NOT IN (select user_id 
                                  from tabelle_members 
                                 where user_group_id = $id)

Markus
 
Hallo,

habe schon wieder ein kleines Problem mit einer ähnlichen Abfrage.

Ich habe ein PHP-Skript mit Gruppen und Usern. In einer Tabelle speichere ich die Gruppenfunktionen + Name etc. in einer weiteren speichere ich die Werte, welche User zu welcher Gruppe gehören.

Tabelle der Gruppenfunktionen ($dbtable8):

id | group_name
1 | test_group_1
2 | test_group_2
3 | test_group_3

Tabelle der Zugehörigkeiten ($dbtable9):

| id | user_id | user_group_id | group_type
| 1 | 1 | 1 | system
| 2 | 1 | 2 | system
| 3 | 1 | 3 | access

Wenn ich jetzt einen Benutzer bearbeiten möchte, sollen mir alle Gruppen angezeigt werden, zu welchen der User gehört. Dabei möchte ich noch Gruppen des Typs 'systems' von der Abfrage ausschließen. Die User-ID des zu bearbeitenden Users bekomme ich über $id. Das alles versuche ich mit JOIN. Das waren meine Versuche, beide haben jedoch nicht funktioniert:

Code:
SELECT $dbtable8.group_name, $dbtable8.id FROM $dbtable8 WHERE $dbtable8.id NOT IN (SELECT user_group_id FROM $dbtable9 WHERE user_id = '$id' AND $dbtable9.group_type = 'system') ORDER BY $dbtable8.group_name ASC
Code:
SELECT $dbtable8.group_name, $dbtable8.id FROM $dbtable8, $dbtable9 WHERE $dbtable8.id = $dbtable9.user_group_id AND $dbtable9.user_id = $id AND $dbtable9.group_type != 'system' ORDER BY $dbtable8.group_name ASC
Ich komme leider nicht weiter. Ich würde mich über Hilfe sehr freuen. Vielen Dank im Voraus.
 
Hallo,

Hast du das Problem mittlerweile lösen können?
Ansonsten poste doch bitte noch ein wenig PHP-Code dazu. Ich hab das Gefühl, der Fehler wird von PHP erzeugt und nicht von MySQL. Aber ist nur ein Verdacht ;)

Markus
 
Hallo Markus,

nein, ich konnte es leider noch nicht lösen. Der entsprechende PHP-Teil sieht so aus:

PHP:
$sql_ue5 = "SELECT $dbtable8.group_name, $dbtable8.id FROM $dbtable8 WHERE $dbtable8.id NOT IN (SELECT user_group_id FROM $dbtable9 WHERE user_id = '$id' AND group_type != 'system') ORDER BY $dbtable8.group_name ASC";
$query_ue5 = mysql_query ($sql_ue5, $dbconnect);
for ($i5 = 0; $i5 < mysql_num_rows ($query_ue5); $i5++) {
 $query_ue5[$i5] = mysql_fetch_array ($query_ue5);
 }
for ($i5 = 0; $i5 < count ($array_ue5); $i5++) {
 $show_access_groups_rest .= "<option value=\"".$array_ue5[$i5][id]."\">".$array_ue5[$i5][group_name]."</option>";
 }
Die For-Schleifen habe ich des Öfteren in Verwendung, in genau dieser Weise. Andere SQL-Abrfagen funktionieren problemlos.

Ist denn meine SQL-Abfrage grundsätzlich richtig? Ich würde mich über Hilfe sehr freuen. Vielen Dank.
 
Hallo,

3 konkrete Vorschläge:

1. Tabellenspalte group_type in dbtable8 verlagern

2. Abfrage folgendermassen gestalten:

SQL:
SELECT $dbtable8.group_name, $dbtable8.id 
  FROM $dbtable8 
 WHERE $dbtable8.id NOT IN 
       (SELECT user_group_id 
          FROM $dbtable9 
         WHERE $dbtable9.user_id = '$id' )
   AND $dbtable8.group_type<>'system'
   ORDER BY $dbtable8.group_name ASC

3. Im PHP-Code wird $array_ue5[] benutzt, aber gar nicht initialisiert.Entweder ist es ein Schreibfehler oder ist die Ursache deines Fehlers, den du oben angeben hattest.

Hoffe es hilft dir,

Markus
 

Neue Beiträge

Zurück