ユーザー、グループ、および権限を持つ PHP/MySQL アプリケーションがあります。
- 各ユーザーは 0..N グループに所属できます
- 各グループには 0..N 人のユーザーを含めることができます
- 各ユーザーは 0..N の権限を持つことができます
- 各権限は 0..N ユーザーに付与できます
- 各グループは 0..N の権限を持つことができます
- 各権限は 0,N グループに付与できます
ここに私のエンティティテーブルがあります:
ユーザー_e:
- ID
- ログインする
- パスワード
- 等...
group_e :
- ID
- ラベル
right_e:
- ID
- ラベル
そして私の関連テーブル:
user_group_a :
- userId は user_e.id を参照します
- groupId は group_e.id を参照します
user_right_a :
- userId は user_e.id を参照します
- rightId は right_e.id を参照します
group_right_a :
- groupId は group_e.id を参照します
- rightId は right_e.id を参照します
これまでのところ、それはかなり単純明快で、本当に独創的なものは何もありません. 私の問題は、「特定の ID のユーザーまたはユーザーが属するグループのいずれかに付与される個別の権利を取得する」ことができるクエリが必要なことです。または、別の言い方をすると、「特定のユーザーの権利とそのグループの権利の (別個の) 結合」)
例えば :
- グループ 1 には権利 1 と 2 があります
- グループ 2 には 6 と 7 の権利があります
- ユーザー 1 はグループ 1 と 2 に属しています
- ユーザー 1 には、権利 2、3、および 4 があります。
次に、ユーザー 1 は、権限 1 と 2 (グループ 1 から)、6 と 7 (グループ 2 から)、および 2、3、4 (自分自身から) を持ちます。したがって、最終的にクエリは権利 1、2、3、4、6、7 を返す必要があります。
これまでのところ、次のクエリがあります。
SELECT DISTINCT R.*
FROM user_e U
LEFT JOIN user_right_a UR
ON U.id = UR.userid
LEFT JOIN right_e R
ON R.id = UR.rightid
LEFT JOIN user_group_a UG
ON U.id = UG.userid
LEFT JOIN group_right_a GR
ON UG.groupid = GR.groupid
AND R.id = GR.rightid
WHERE U.id = 1
しかし、いくつかのテストデータ (必要に応じて提供できます) を入れたテストデータベースで実行すると、すべての属性 (id、ラベル) が NULL に設定された単一の権利が返されますが、複数の行が返されます。
このクエリの何が問題になっていますか?
ご協力いただきありがとうございます :)
編集:ここにデータがあります:http ://www.fileden.com/files/2007/8/1/1314138/test.sql (phpmyadminによってエクスポート)