1

usersrolesおよびの 3 つの MySQL テーブルがありpositionsます。

usersはかなり自明です。このテーブルは、、 、などroles、人が持つ可能性のある役職のリストです。テーブルには、またはなどのブール値のパーミッションの長い配列もあります。ロールのビット値が false (または「0」) に設定されている場合、そのロールにはその権限がありません。janitorpresidentmanagerrolesaccess_basementuser_directory_access

注意が必要なのは、ユーザーが複数のロールを持つ可能性があることです。そのため、それらがテーブルによって接続されているのは、単純にとフィールドpositionsのペアです。したがって、次のようなクエリを実行すると:userIdroleId

SELECT * FROM users 
    LEFT JOIN positions ON users.userId=positions.userId
    LEFT JOIN roles ON roles.roleId=positions.roleId 
WHERE users.userId=123

次のような結果が得られる場合があります。

+---------+-----------+-----------------+-----------------------+
| name    | title     | basement_access | user_directory_access |
+---------+-----------+-----------------+-----------------------+
| Bob     | Janitor   | true            | false                 |
+---------+-----------+-----------------+-----------------------+
| Bob     | President | false           | true                  |
+---------+-----------+-----------------+-----------------------+

ORBob には 2 つのロールがありますが、それぞれに異なるアクセス権があるため、MySQL クエリ以降の結果とすべての行にわたる論理演算を組み合わせて、次のようなテーブルを作成したいと思います。

+---------+-----------------+-----------------------+
| name    | basement_access | user_directory_access |
+---------+-----------------+-----------------------+
| Bob     | true            | true                  |
+---------+-----------------+-----------------------+

問題は、選択した複数の MySQL 行に OR 演算子を適用することは可能ですか?

ありがとう!

4

1 に答える 1

1

これを解決する 1 つの方法は、値 0 と 1 をロールのアクセス許可として使用することです。そして、次のようなクエリを使用します。

SELECT u.name, SUM(r.basement_access) AS basement_access, SUM(r.user_directory_access) AS user_directory_access
FROM users  u
  LEFT JOIN positions p ON u.userId=p.userId
  LEFT JOIN roles r ON r.roleId=p.roleId 
WHERE u.userId=123
GROUP BY u.userId;
于 2013-09-03T16:12:13.490 に答える