2016-09-18 24 views
0

MySqlを使用して、指定されたユーザIDで複数の多対多テーブル(users_rolesおよびroles_permissions)に参加したいと思います。 しかし、以下のようなエラーが出るので、私の質問には何か問題があります。SQL JOIN複数の多対多テーブル

#1054 - '句で' 不明な列 'users_roles.role_id'

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 

PHPMyAdminの内部の私のテーブル構造は以下の通りです:

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

古い暗黙の結合構文と新しい明示的な結合構文を混在させることはできません。 –

+1

さて、古い構文と新しい構文を混在させることはできますが、明示的な結合ではONで使用できる列に関してより限定的です: 'FROM users_roles JOIN roles ON users_roles.role_id = roles.id JOIN roles_permissions ON roles_permissions.role_id = roles.id JOINの権限を有効にするroles_permissions.permission_id = permissions.id WHERE users_roles.user_id = 1' – dnoeth

+0

JOINSで「新しい」構文スタイルをチェックできるリンクがありますか? – CodeWhisperer

答えて

1

私はあなたがすべきだと思います適切な結合のセットを使用する

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


あなたは

使い方は別名

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; 

を使用して

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; 

に参加し、次の2つの方法でそれを行うことができます 、以下のクエリを使用することができますしかし、 JOINSを使用することは効率的な方法です。あなたはそれを持っていますか?任意のヘルプ、お気軽にお問い合わせください

関連する問題