1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Verzwicktes Join in MySQL 4.0.0

    • Frage
  • rck
  • 2. Mai 2004 um 10:50
  • Unerledigt
  • rck
    15
    rck
    Mitglied
    Reaktionen
    2
    Punkte
    2.342
    Beiträge
    437
    • 2. Mai 2004 um 10:50
    • #1

    Hallo! Gestern habe ich Stunden mit einem Statement verbracht und dachte schon, ich hätte es gelöst. Dann hab ich einen Testfall gefunden, bei dem es versagt. Heute habe ich schon wieder zwei Stunden daran herumgeknobelt und komme auf keine vernünftige Lösung.

    Es handelt sich um ein Berechtigungssystem. Es gibt eine Tabelle Benutzer, eine Tabelle BenutzerRecht (für die n:m Beziechung) und eine Tabelle Recht.

    Die Tabelle Recht enthält sämtliche Berechtigungen (derzeit 10, können mehr werden). Tabelle Benutzer enthält sämtliche Benutzer. Und BenutzerRecht enthält, welcher Benutzer welches Recht hat.

    Das große Problem: In BenutzerRecht habe ich nur Leute drinnen, die tatsächlich ein Recht haben. Neu angelegte Benutzer haben nämlich keinerlei Rechte. Außerdem speichere ich nur Rechte ab, die auch tatsächlich gegeben werden.


    Folgende Tabellenstruktur:

    Code
    mysql> describe Benutzer;
    +----------+-------------+------+-----+---------+----------------+
    | Field    | Type        | Null | Key | Default | Extra          |
    +----------+-------------+------+-----+---------+----------------+
    | ID       | int(11)     |      | PRI | NULL    | auto_increment |
    | login    | varchar(20) |      |     |         |                |
    | vorname  | varchar(20) |      |     |         |                |
    | nachname | varchar(20) |      |     |         |                |
    | password | varchar(50) |      |     |         |                |
    +----------+-------------+------+-----+---------+----------------+
    5 rows in set (0.01 sec)
    
    
    mysql> select * from Benutzer;
    +----+---------+---------------+---------------+----------------------------------+
    | ID | login   | vorname       | nachname      | password                         |
    +----+---------+---------------+---------------+----------------------------------+
    |  1 | rck     | René          | Kiesler       | xxxxxxxxxxxxxxxx                 |
    |  7 | admin   | Administrator | darf alles    | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
    |  6 | sammael | Florian       | Schererbauer  | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
    |  4 | demo    | Demouser      | Passwort=demo | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
    +----+---------+---------------+---------------+----------------------------------+
    4 rows in set (0.01 sec)
    
    
    
    
    mysql> describe BenutzerRecht;
    +------------+------------+------+-----+---------+-------+
    | Field      | Type       | Null | Key | Default | Extra |
    +------------+------------+------+-----+---------+-------+
    | BenutzerID | int(11)    |      | PRI | 0       |       |
    | RechtID    | int(11)    |      | PRI | 0       |       |
    | darf       | tinyint(1) |      |     | 0       |       |
    +------------+------------+------+-----+---------+-------+
    3 rows in set (0.00 sec)
    
    
    mysql> select * from BenutzerRecht;
    +------------+---------+------+
    | BenutzerID | RechtID | darf |
    +------------+---------+------+
    |          1 |       3 |    2 |
    |          4 |       2 |    1 |
    |          1 |       2 |    1 |
    |          7 |       1 |    3 |
    |          7 |       2 |    3 |
    |          7 |       3 |    3 |
    |          7 |       4 |    3 |
    |          7 |       5 |    3 |
    |          7 |       6 |    3 |
    |          7 |       7 |    3 |
    |          7 |       8 |    3 |
    |          7 |       9 |    3 |
    |          7 |      10 |    3 |
    +------------+---------+------+
    13 rows in set (0.01 sec)
    
    
    
    
    mysql> describe Recht;
    +-------------+-------------+------+-----+---------+----------------+
    | Field       | Type        | Null | Key | Default | Extra          |
    +-------------+-------------+------+-----+---------+----------------+
    | ID          | int(11)     |      | PRI | NULL    | auto_increment |
    | bezeichnung | varchar(30) |      | UNI |         |                |
    +-------------+-------------+------+-----+---------+----------------+
    2 rows in set (0.00 sec)
    
    
    mysql> select * from Recht;
    +----+-------------------+
    | ID | bezeichnung       |
    +----+-------------------+
    |  1 | Benutzer          |
    |  2 | History           |
    |  3 | Branchen          |
    |  4 | Auftraggeber      |
    |  5 | Kunden            |
    |  6 | KundeAuftraggeber |
    |  7 | Ablage            |
    |  8 | Stuetzpunkte      |
    |  9 | Tour              |
    | 10 | Entwicklung       |
    +----+-------------------+
    10 rows in set (0.01 sec)
    Alles anzeigen


    und das Statement, mit dem ich das ganze verknüpfe (MySQL 4.1.0 mit Subselects ist aufgrund des Alpha-Status nicht erlaubt):

    Code
    (SELECT Recht.ID, Recht.bezeichnung, Benutzer.login, 0 darf
            FROM Recht LEFT JOIN BenutzerRecht BRR ON Recht.ID=BRR.RechtID,
                    BenutzerRecht BRL RIGHT JOIN Benutzer ON Benutzer.ID=BRL.BenutzerID
            WHERE ((BRR.darf IS NULL) OR (BRL.darf IS NULL)))
    
    
    UNION
    
    
    (SELECT Recht.ID, Recht.bezeichnung, Benutzer.login, BRR.darf darf
            FROM Recht LEFT JOIN BenutzerRecht BRR ON Recht.ID=BRR.RechtID,
                    BenutzerRecht BRL RIGHT JOIN Benutzer ON Benutzer.ID=BRL.BenutzerID
            WHERE BRR.darf=BRL.darf)
    
    
    UNION
    
    
    (SELECT Recht.ID, Recht.bezeichnung, Benutzer.login, 0 darf
            FROM Recht LEFT JOIN BenutzerRecht BRR ON Recht.ID=BRR.RechtID,
                    BenutzerRecht BRL RIGHT JOIN Benutzer ON Benutzer.ID=BRL.BenutzerID
            WHERE AND BRR.darf!=BRL.darf)
    
    
    ORDER BY Recht.bezeichnung;
    Alles anzeigen

    Die Lösung schaut nicht nur grauslich aus, sondern funktioniert auch nicht so ganz, wie sie soll. Man müsste über das ganze noch ein MAX(darf) machen, das geht aber irgendwie nicht und macht's auch nicht besser.

    Ich werde das MAX(darf) mal händisch im PHP machen, nachdem ich auf keinen grünen Zweig komme. ...irgendwelche anderen Tips? // René

    [ egapemoh eniem ] [ Korneuburg Community ] [ FB ] [ Xng ]

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung