0

クエリしようとしている3つのテーブルは次のとおりです。

DB構造:

roles_permissions: id, role_id, permission_id

user_roles: id, name, user_id

permissions: id, name

SQLクエリ

SELECT ur.name AS role_name,perm.name AS perm_name FROM user_roles AS ur
    INNER JOIN roles_permissions as p
    ON ur.id=p.role_id
    INNER JOIN permissions AS perm
    ON p.permission_id = perm.id
    WHERE ur.user_id='$account_id'

上記のクエリの結果

    array(11) {
  [0]=>
  array(2) {
    ["role_name"]=>
    string(5) "Owner"
    ["perm_name"]=>
    string(12) "view project"
  }
  [1]=>
  array(2) {
    ["role_name"]=>
    string(5) "Admin"
    ["perm_name"]=>
    string(12) "edit project"
  }
  [2]=>
  array(2) {
    ["role_name"]=>
    string(6) "Editor"
    ["perm_name"]=>
    string(14) "create project"
  }
  [3]=>
  array(2) {
    ["role_name"]=>
    string(5) "Owner"
    ["perm_name"]=>
    string(12) "view project"
  }
  [4]=>
  array(2) {
    ["role_name"]=>
    string(5) "Admin"
    ["perm_name"]=>
    string(12) "edit project"
  }
  [5]=>
  array(2) {
    ["role_name"]=>
    string(6) "Editor"
    ["perm_name"]=>
    string(14) "create project"
  }
  [6]=>
  array(2) {
    ["role_name"]=>
    string(5) "Owner"
    ["perm_name"]=>
    string(12) "view project"
  }
  [7]=>
  array(2) {
    ["role_name"]=>
    string(6) "Editor"
    ["perm_name"]=>
    string(12) "edit project"
  }
  [8]=>
  array(2) {
    ["role_name"]=>
    string(5) "Owner"
    ["perm_name"]=>
    string(12) "view project"
  }
  [9]=>
  array(2) {
    ["role_name"]=>
    string(5) "Admin"
    ["perm_name"]=>
    string(12) "edit project"
  }
  [10]=>
  array(2) {
    ["role_name"]=>
    string(6) "Editor"
    ["perm_name"]=>
    string(14) "create project"
  }
}

私がやろうとしているのはuser_roles、特定のuser_idに割り当てられているすべてを選択し、からそのロールに割り当てられているアクセス許可IDを取得し、テーブルroles_permissionsから各アクセス許可の名前を取得することです。permissionsグループ化したいuser_roles.name

したがって、結果の配列は次のようになります。

    array(3) {
  ["Owner"]=>
  array(3) {
    ["perm_name"]=>
    string(12) "view project"
    ["perm_name"]=>
    string(12) "create project"
    ["perm_name"]=>
    string(12) "edit project"
  }
  ["Editor"]=>
  array(2) {
    ["perm_name"]=>
    string(12) "view project"
    ["perm_name"]=>
    string(12) "edit project"
  }
   ["Admin"]=>
  array(3) {
    ["perm_name"]=>
    string(12) "view project"
    ["perm_name"]=>
    string(12) "create project"
    ["perm_name"]=>
    string(12) "edit project"
  }

}

ですから、誰かがそれを手伝ってくれるなら、それは素晴らしいことです。また、これから学ぶことを考えているので、私のためにそれを説明できれば、それは素晴らしいことです。

ありがとう

SQL FIDDLE:http ://sqlfiddle.com/#!2/a7954/1

4

3 に答える 3

1

テストデータが間違っています。つまり、role_id=1のテーブルrole_permissionのuser_role.id=1(name = owner、user_id = 1)にはpermission_id = 1(つまりビュー)しかありません。

更新されたサンプルを確認してくださいhttp://sqlfiddle.com/#!2/41b7b/2

于 2013-01-29T16:24:08.633 に答える
1

これで問題が直接解決されるわけではありませんが、スキーマにはいくつかの問題があります。その中で最も重要なのは、のタプルは一意(role_id, permission_id)ではないということです。roles_permissionsこれが私が物事を再構築する方法です:

role
==========
id  -- autoincrement
name  -- varchar

user_role
===========
role_id  -- fk to role.id
user_id  -- fk to user.id (not listed here, but you obviously have one)

permission
===========
id  -- autoincrement
name  -- varchar

role_permission
===================
role_id  -- fk to role.id
permission_id  -- fk to permission.id

(パーミッショングループまたはロール階層を実行しようとすると、これはより複雑になることに注意してください)

サンプルデータを使用して、セットアップを示す修正されたフィドルの例。

于 2013-01-29T17:15:38.477 に答える
0

テーブル構造を見ずにこれをテストするのは難しいですが、次を追加してみましたか?

group by ur.name, perm.name
order by ur.name

where句の後?

于 2013-01-29T15:51:50.863 に答える