0

ユーザー、グループ、および権限を持つ 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によってエクスポート)

4

1 に答える 1