Abfrage über 4 Tabellen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Abfrage über 4 Tabellen

    hi leute,

    ich sitze gerade an einem berechtigungssystem und mache auch meine ersten gehversuche mit joins.
    hier erstmal die tabellen:


    "datentabellen"
    Code:
    CREATE TABLE `user_group` (
      `name` varchar(20) NOT NULL default '',
      `description` varchar(50) default NULL,
      PRIMARY KEY  (`name`)
    )
    CREATE TABLE `user_right` (
      `name` varchar(20) NOT NULL default '',
      `description` varchar(50) default NULL,
      PRIMARY KEY  (`name`)
    )
    "vernüpfungstabellen"
    Code:
    CREATE TABLE `user_account_group` (
      `account_name` varchar(20) NOT NULL default '',
      `group_name` varchar(20) NOT NULL default '',
      UNIQUE KEY `account_name` (`account_name`,`group_name`)
    )
    CREATE TABLE `user_group_right` (
      `group_name` varchar(20) NOT NULL default '',
      `right_name` varchar(20) NOT NULL default '',
      UNIQUE KEY `group_name` (`group_name`,`right_name`)
    )
    es soll jeder benutzer einer oder mehrere gruppe(n) angehören können und jede gruppe sollen wiederum rechte zugewiesen werden. also wie bei jedem betriebssystem.

    so, jetzt möchte ich gerne zu einem benutzer alle "gruppen" und die dazugehörigen "rechte" auslesen.
    $account_name habe ich bereits in einer variablen.
    die gruppenzugehörigkeit kann ich schonmal abfragen:
    PHP-Code:
    $sql="SELECT
    `group_name`, user_group.description AS `group_description`
    FROM `user_account_group`
    JOIN `user_group` ON `group_name`=`name`
    WHERE `account_name`='
    $account_name'"
    so, und jetzt drehe ich mich im kreis. ich wollte noch einen weiteren join hinzufügen, um an die rechte zu kommen:
    PHP-Code:
    JOIN `user_group_right` ... 
    aber egal, wie ich es anstelle, mysql meldet:
    Code:
    Column: 'group_name' in field list is ambiguous
    habe ich schon grundsätzlich die tabellenfelder falsch benannt oder stelle ich mich einfach zu dusselig bei der abfrage an (muss ich einen alias vergeben)?
    wahrscheinlich trifft beides zu

  • #2
    Es gibt mehr als eine Tabelle, in der es eine Spalte mit diesem Namen gibt.

    Schreibe bei der Abfrage tabelle.spalte, dann weiß mySQL, welche Spalte welcher Tabelle du haben willst
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      hab ich ja versucht:
      PHP-Code:
      $sql="SELECT
      `group_name`, user_group.description AS `group_description`
      FROM `user_account_group`
      JOIN `user_group` ON `group_name`=`name`
      JOIN `user_group_right` ON user_group_right.group_name=`group_name`
      WHERE `account_name`='
      $account_name'"
      also im zweiten join: "ON user_group_right.group_name" aber mysql sagt, dass 'group_name' nicht eindeutig ist.

      Kommentar


      • #4
        (1) schreibst alle Felder mit Punkten, kannst auch die Tabellen mit u r g gr abkürzen.

        (2) Anstatt eines gewöhnlichen inner join .. on .. kannst Du einfach kommas setzen und where brauchen:
        select distinct rechte.name, rechte.bezeichnung
        from users,gruppen, rechtezuweisung, rechte
        where users.name='$account' and group.username=users.name
        and rechtezuweisung.groupid=group.groupid
        and rechtezuweisung.rechteid=rechte.rechteid;

        keine Ahnung, ob das 'effizient' ist, und ob join on besser ist wie where.

        Ich haben noch ein distinct gesetzt, weil ein user über mehrere Gruppen zum gleichen Recht kommen könnte.

        Die Feldnamen habe ich mir erlaubt selber zu erfinden.

        Kommentar


        • #5
          Original geschrieben von 3DMax
          also im zweiten join: "ON user_group_right.group_name" aber mysql sagt, dass 'group_name' nicht eindeutig ist.
          Aus welcher Tabelle soll mySQL die Spalte user_group_name den im ersten JOIN auslesen?

          Bist du sicher, dass du im zweiten JOIN wirklich `group_name` verwenden willst?
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            so, ich glaube, ich hab's jetzt.
            funktioniert zumindest erstmal mit meinen testdaten
            PHP-Code:
            $sql="SELECT
            user_group.description AS `group_description`,
            user_group.name AS `group_name`,
            user_right.description AS `right_description`,
            user_right.name AS `right_name`
            FROM `user_account_group`
            JOIN `user_group` ON user_group.name=user_account_group.group_name
            JOIN `user_group_right` ON user_group_right.group_name=user_group.name
            JOIN `user_right` ON user_group_right.right_name=user_right.name
            WHERE `account_name`='
            $account_name'"
            @gleiwitz19 ich dachte für soetwas benutzt man joins?
            [edit] jetzt ist er auch gesperrt. mir scheint, dir gehen langsam die accounts aus
            Zuletzt geändert von 3DMax; 04.09.2006, 20:32.

            Kommentar


            • #7
              Original geschrieben von 3DMax

              @gleiwitz19 ich dachte für soetwas benutzt man joins?
              [edit] jetzt ist er auch gesperrt. mir scheint, dir gehen langsam die accounts aus
              ein FROM a,b und ein FROM a INNER JOIN b ON true sind dasselbe.

              [edit]nö. Im übrigen ist mein richtiger Nickname adeno4you (auch gebannt).

              ____________
              Es heisst nicht Banner, es heisst Banned.

              Kommentar


              • #8
                Original geschrieben von jhaase
                ein FROM a,b und ein FROM a INNER JOIN b ON true sind dasselbe.
                gut, dann werde ich es nach deinem beispiel umschreiben, sieht für mich auch logischer aus.
                der hinweis mit den doppelten rechten war übrigens top, hatte vor, es später mit php auszufiltern

                habe auch nicht so recht verstanden, was ich da oben überhaupt verzapft habe - war erstmal nur froh, dass es "funzte"

                Kommentar


                • #9
                  so, folgendes liefert mir ein identisches ergebnis:
                  PHP-Code:
                  $sql="SELECT DISTINCT
                  user_group.description AS `group_description`,
                  user_group.name AS `group_name`,
                  user_right.description AS `right_description`,
                  user_right.name AS `right_name`
                  FROM `user_account_group`, `user_group`, `user_group_right`, `user_right`
                  WHERE user_account_group.account_name='
                  $account_name'
                  AND user_group.name=user_group_right.group_name
                  AND user_group_right.right_name=user_right.name"

                  welche abfrage ist denn nun besser?
                  oder ist das wirklich jacke wie hose?

                  Kommentar

                  Lädt...
                  X