2016-09-18 3 views
0

Mit MySql möchte ich mehrere Viele-zu-Viele-Tabellen (users_roles und roles_permissions) durch eine bestimmte Benutzer-ID verbinden. Aber etwas stimmt nicht mit meiner Abfrage, weil es einen Fehler wie folgt gibt.SQL JOIN mehrere Viele-zu-Viele-Tabellen

# 1054 - Unknown column 'users_roles.role_id' in 'on-Klausel'

SELECT roles.name, permissions.name 
FROM users_roles, roles_permissions 
JOIN roles ON users_roles.role_id = roles.id 
JOIN permissions ON roles_permissions.permission_id = permissions.id 
WHERE users_roles.user_id = 1 AND roles_permissions.role_id = roles.id 

innerhalb PHPMyAdmin Meine Tabellenstruktur wie folgt lautet:

Table users_roles 
id | user_id | role_id 

Table roles_permissions 
id | role_id | permissions_id 

Table roles 
id | name | description 

Table permissions 
id | name | description 
+3

Sie können die alte implizite und neue explizite Join-Syntax nicht mischen. –

+1

Nun, Sie können alte und neue Syntax mischen, aber Sie besser nicht (die explizite Join ist restriktiver in Bezug auf welche Spalten in ON verwendet werden können): 'FROM users_roles Join Rollen ON users_roles.role_id = Rollen.ID JOIN roles_permissions ON roles_permissions.role_id = roles.id JOIN Berechtigungen ON roles_permissions.permission_id = permissions.id WHERE users_roles.user_id = 1' – dnoeth

+0

Haben Sie einen Link, wo ich den "neuen" Syntax-Stil mit JOINS überprüfen kann? – CodeWhisperer

Antwort

1

Ich glaube, Sie sollten Verwenden Sie eine Reihe von richtigen Verbindung

SELECT roles.name, permissions.name 
FROM users_roles 
JOIN roles ON users_roles.role_id = roles.id 
JOIN roles_permissions on roles_permissions.role_id = users_roles.role_id 
JOIN permissions ON roles_permissions.permission_id = permissions.id 
WHERE users_roles.user_id = 1 
1


Sie das unten stehende Abfrage verwenden können, Sie es auf zwei Arten tun können,

Joins

SELECT roles.name, permissions.name 
FROM users_roles INNER JOIN roles_permissions 
ON (users_roles.role_id = roles.id) 
INNER JOIN permissions ON (roles_permissions.permission_id = permissions.id) 
AND users_roles.user_id = 1 
AND roles_permissions.role_id = roles.id; 

Mit Alias ​​

SELECT R.name, P.name from 
users_roles UR, roles_permissions RP, permissions P, roles R 
WHERE UR.role_id = R.id AND 
RP.role_id = UR.role_id AND 
RP.permission_id = P.id 
UR.user_id = 1; 

Aber JOINS ist der effiziente Weg. Ich hoffe du hast es verstanden. Jede Hilfe, fühlen Sie sich frei zu fragen