Verschachteltes INNER JOIN meint "Every derived table must have its own alias "

Darian

Erfahrenes Mitglied
Hallo Leute,

bin gerade dabei eine Userverwaltung zu machen, und wollte mich auch mal mehr mit SQL Statements beschäftigen.

Folgende Tabellen:
- user (eh klar)
- user_priv (teilt einem User mehrere Rechte zu)
- priv (alle Rechte die es gibt)

Zwischen user und priv besteht ein n:n

Ich habe jetzt folgendes SQL probiert:

Code:
SELECT * FROM (
    SELECT user.full_name, user.customer_id, user_priv.priv_id 
    FROM user INNER JOIN user_priv 
    ON user.id=user_priv.user_id AND user.id=1) 
INNER JOIN privileges 
ON privileges.id=user_priv.priv_id;

Und Fehlermeldung ist die folgende:
Code:
#1248 - Every derived table must have its own alias

Wäre fein wenn mir da jemand helfen könnte, vielleicht habe ich ja auch einen Denkfehler ;-)

lg und danke für Verbesserungsvorschläge
Darian
 
Hi,

das Ergebnis Deines Subselects braucht einen Alias:

Code:
SELECT * FROM (
    SELECT user.full_name, user.customer_id, user_priv.priv_id AS priv_id
    FROM user INNER JOIN user_priv 
    ON user.id=user_priv.user_id AND user.id=1) t
INNER JOIN privileges 
ON privileges.id=t.priv_id;

Den Subselect könntest Du aber auch durch einen INNER JOIN ersetzen:

SQL:
SELECT user.full_name, user.customer_id, user_priv.priv_id, privileges.* 
   FROM user 
   INNER JOIN user_priv 
      ON (user.id=user_priv.user_id AND user.id=1) 
   INNER JOIN privileges 
      ON privileges.id=user_priv.priv_id;

LG
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

wusste ich nicht, aber die zweite Möglichkeit finde ich persönlich um einiges schöner, darum werde ich mir in Zukunft die angewöhnen.

Noch eine kurze Frage, wenn ich es so mache, kriege ich ja in jedem Datensatz noch einmal denn namen und die customer_id. Bei 10 verschiedenen Rechten, bekomme ich auch 10 mal name und customer_id.

Wäre es daher schöner wenn ich zuerst nur die privileges selektiere, und name und customer_id extra, oder ist es eher egal?

Danke für die Hilfe.

lg Darian
 
Zuletzt bearbeitet:
Hi,

Wäre es daher schöner wenn ich zuerst nur die privileges selektiere, und name und customer_id extra, oder ist es eher egal?

Eine Datenbankabfrage ist besser, als zwei. ;)

Was willst Du überhaupt im Endeffekt für ein Ergebnis haben? Einfach nur eine Liste der Rechte für den Benutzer? Dann könntest Du nach userID oder so gruppieren und per GROUP_CONCAT die Rechte auflisten.

SQL:
SELECT user.full_name, user.customer_id, GROUP_CONCAT(privileges.privilege)
   FROM user
   INNER JOIN user_priv
      ON (user.id=user_priv.user_id AND user.id=1)
   INNER JOIN privileges
      ON privileges.id=user_priv.priv_id
   GROUP BY user.id

LG
 
Hallo,

ja echt cool, sowas habe ich mir schon öfter mal gewünscht.

Hat mir auch gleich ein paar andere Probleme gelöst.

Danke dir.

lg Darian
 

Neue Beiträge

Zurück