# MySQL-Abfrage von Tabellen mit Ausschluss von Werten



## qsrs (9. Mai 2007)

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.


----------



## dorfdepp (9. Mai 2007)

Schau Dir doch mal JOIN an:

http://www.w3schools.com/sql/sql_join.asp


----------



## qsrs (9. Mai 2007)

Genau das war es, vielen Dank.


----------



## qsrs (13. Mai 2007)

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.


----------



## lmarkus31 (13. Mai 2007)

Hallo qsrs,

In deiner Lösung ist ein falscher Join drin.

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


```
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


----------



## qsrs (13. Mai 2007)

Hallo Markus, vielen Dank für deine Hilfe, das hat funktioniert.


----------



## qsrs (23. Mai 2007)

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:


```
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
```


```
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.


----------



## lmarkus31 (25. Mai 2007)

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


----------



## qsrs (26. Mai 2007)

Hallo Markus,

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


```
$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.


----------



## lmarkus31 (26. Mai 2007)

Hallo,

3 konkrete Vorschläge:

1. Tabellenspalte group_type in dbtable8 verlagern

2. Abfrage folgendermassen gestalten:


```
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


----------



## qsrs (27. Mai 2007)

Hallo Markus,

vielen Dank für deine Hilfe. Jetzt funktioniert es. Es waren gleich zwei Fehler. Zum einen musste ich den PHP-Code ändern, zum anderen hat mir deine SQL-Abfrage zum gewünschten Ergebnis verholfen. Nochmals vielen Dank und schöne Feiertage.


----------



## qsrs (29. Mai 2007)

Nun doch noch einmal eine Frage. Ich habe bis jetzt nur SELECT-Abfragen gestaltet. Wie würde den grob ein UPDATE eines Datensatzes mit Join aussehen, wenn ich laut obigem Beispiel alle Gruppen/Userzugehörigkeiten aus $dbtable9 sammle aber in einer anderen Tabelle (die der User) einen Wert bei allen Usern ändern möchte, und zwar bei denen, die ich aus $dbtable9 abfrage? Vielen Dank für die Anregungen und evtl. Hilfe.


----------



## Radhad (29. Mai 2007)

Du musst für jeden User einzeln ein Update machen, außer du willst bei allen, die den Wert X haben in Y ändern.


----------



## qsrs (29. Mai 2007)

In meinem Fall ist es relativ simpel, denn der Wert würde für alle User gleich aussehen. Ich weiß nur nicht, wie diese UPDATE-Abfrage aussieht.


----------

