0

SQLでの結合に問題があります。私は3つのテーブルを持っています。

1: Lists the user details
2: Lists the permissions the user group has
3: Lists the page that that group can access

 

   Table1 users :
   ****************************************
   username |  group
   ****************************************
   admin    |  administrator 


   Table2 groups :
   *********************************************
   user_group    | create | view | system_admin
   *********************************************
   administrator |   1    |   0  |      1


   Table3 urls:
   *********************************************
   create     |  view      | system_admin
   *********************************************
   create.php |  view.php  |  system.php

(私のテーブルの描画についてお詫びします)

私がphpを介して行っているのは、それらが属するuser_groupを取得することです。次に、ヒットしたばかりのページにアクセスできるかどうかを確認するか、リダイレクトする必要があります。

現在のテーブルレイアウトを使用して、結合を介した方法でこれを実現できますか?または、この種のことを直感的に理解できないため、これらのテーブルを再設計することを検討しますか?

4

3 に答える 3

2

私は実際にテーブルを再設計して、クエリを簡単にすることができます。

create table users
(
    id int,
    username varchar(10),
    groupid int
);
insert into users values (1, 'admin', 1);

create table groups
(
    groupid int,
    groupname varchar(20)
);
insert into groups values (1, 'administrator');

create table permissions
(
    permissionid int,
    permissionname varchar(20)
);
insert into permissions values (1, 'create');
insert into permissions values (2, 'view');
insert into permissions values (3, 'system_admin');

create table urls
(
    urlid int,
    name varchar(10)
);
insert into urls values(1, 'create.php');
insert into urls values(2, 'view.php');
insert into urls values(3, 'system.php');

create table group_permission_urls
(
    groupid int,
    permissionid int,
    urlid int
);
insert into group_permission_urls values(1, 1, 1);
insert into group_permission_urls values(1, 0, 2);
insert into group_permission_urls values(1, 3, 3);

次に、クエリは次のようになります。

select *
from users us
left join groups g
  on us.groupid = g.groupid
left join group_permission_urls gpu
  on us.groupid = gpu.groupid
left join permissions p
  on gpu.permissionid = p.permissionid
left join urls u
  on gpu.urlid = u.urlid

SQL FiddlewithDemoを参照してください

于 2012-09-12T16:42:26.670 に答える
0

$current_pageをサブクエリの結果と比較することによりIN()、1つのクエリでこれを行うことができます。ページが、ユーザーがアクセス許可を持っている列にリストされているものと一致する場合、これは行を返します。許可された列に一致するものがない場合は、行を返さないようにする必要があります。

SELECT
  groups.create,
  groups.view, 
  groups.system_admin,
  1 AS can_access
FROM 
  users
  JOIN groups ON users.group = groups.user_group 
WHERE 
  users.username = '$some_username'
  AND (
    /* Substitute the current page. Better, use a prepared statement placeholder if your API supports it */
    (groups.create = 1 AND '$current_page' IN (SELECT DISTINCT create FROM urls))
    OR 
    (groups.view = 1 AND '$current_page' IN (SELECT DISTINCT view FROM urls))
    OR 
    (groups.system_admin = 1 AND '$current_page' IN (SELECT DISTINCT system_admin FROM urls))
  )

$current_pageこれは、3つの列のそれぞれからの可能な値の個別のセットと比較することによって機能します。列と一致し、ユーザーのグループにもそのタイプの権限がある場合、行が返されます。

于 2012-09-12T16:37:50.257 に答える
0
select case when count(1) > 0 then 'come in' else 'go away' end 
from users, groups, urls
where 
users.username = '$username' and
users.user_group = groups.user_group and
  ((urls.create = '$url' and groups.create = 1) or 
   (urls.view = '$url' and groups.view = 1) or 
   (urls.system_admin = '$url' and groups.system_admin = 1))
于 2012-09-12T16:39:33.993 に答える