Hallo!
Ich verzweifle an einer Datenbankabfrage für eine Benutzerverwaltung und hoffe nun,
dass mir hier jemand helfen kann.
Ich habe 3 Tabellen "groups", "user", "correlation_groups_user".
Die Gruppen sind als nested set abgelegt.
┌──────────────────────────────┐ ┌───────────────┐ ┌──────────────────┐
│ table.groups │ │ table.user │ │ table.corre_g_u │
├─────────┬──────┬──────┬──────┤ ├────────┬──────┤ ├─────────┬────────┤
│ groupId │ name │ lKey │ rKey │ │ userId │ name │ │ groupId │ userId │
├─────────┼──────┼──────┼──────┤ ├────────┼──────┤ ├─────────┼────────┤
│ 1 │ foo │ 1 │ 10 │ │ 1 │ Uwe │ │ 1 │ 1 │
├─────────┼──────┼──────┼──────┤ ├────────┼──────┤ ├─────────┼────────┤
│ 2 │ bar │ 2 │ 5 │ │ 2 │ Klaus│ │ 1 │ 2 │
├─────────┼──────┼──────┼──────┤ ├────────┼──────┤ ├─────────┼────────┤
│ 3 │ bla │ 3 │ 4 │ │ 3 │ Gabi │ │ 2 │ 3 │
├─────────┼──────┼──────┼──────┤ ├────────┼──────┤ ├─────────┼────────┤
│ 4 │ blub │ 6 │ 7 │ │ 4 │ Inge │ │ 3 │ 1 │
├─────────┼──────┼──────┼──────┤ ├────────┼──────┤ ├─────────┼────────┤
│ 5 │ beta │ 8 │ 9 │ │ 5 │ Gerd │ │ 3 │ 4 │
└─────────┴──────┴──────┴──────┘ ├────────┼──────┤ ├─────────┼────────┤
│ 6 │ Sepp │ │ 4 │ 5 │
└────────┴──────┘ ├─────────┼────────┤
│ 5 │ 6 │
└─────────┴────────┘
Die Benutzerverwaltung ist ein Modul das in einer weiteren Tabelle
"correlation_moduls_groups" mit der "groupId" verknüpft wird.
(modulId 1 = Benutzerverwaltung)
┌───────────────────┐
│ table.corre_m_g │
├─────────┬─────────┤
│ modulId │ groupId │
├─────────┼─────────┤
│ 1 │ 1 │
├─────────┼─────────┤
│ 1 │ 2 │
├─────────┼─────────┤
│ 1 │ 4 │
└─────────┴─────────┘
Was ich jetzt suche ist eine Abfrage die folgendes macht zurück gibt.
Alle Gruppen in denen ein Benutzer ist UND die Zugriff auf die Benutzerverwaltung haben.
Das ist soweit erstmal kein Problem.
Dann suche ich von den Gruppen alle Benutzer die in Untergruppen sind ABER NICHT in
übergeordneten Gruppen. Und daran scheitere ich.
Beispiele:
- Uwe sieht alle Benutzer ausser Klaus und sich selbst
- Klaus sieht alle Benutzer ausser Uwe und sich selbst
- Gabi sieht nur Inge
- Inge sieht gar nichts weil ihre Gruppe keinen Zugriff auf das Modul hat
- Gerd sieht niemanden weil seine Gruppe keine Untergruppe hat
- Sepp sieht aus dem selben Grund auch niemanden
Im Idealfall hätte ich gern nur eine Abfrage und keine doppelten Datensätze für den zweiten
Teil damit ich SQL_CALC_FOUND_ROWS noch verwenden kann. Das Ergebnis der Abfrage sollte
auch nach den Gruppennamen sortierbar sein.
Ich bin für jede Hilfe dankbar!
Beste Grüße!