2013-01-16 66 views
1

我需要你在编写一个查询的帮助 - 请查看下面选择查询 - 选择父权限

类别

CREATE TABLE IF NOT EXISTS `category` (
    `catid` varchar(170) NOT NULL, 
    `name` varchar(170) NOT NULL, 
    `parent_catid` varchar(170) NOT NULL, 
    `inherit_parent_perms` enum ('Y', 'N') NOT NULL, 
    KEY `idx_wss` (`catid`) 
); 
INSERT INTO `category` VALUES('1', 'Fruits', '0', 'N'); 
INSERT INTO `category` VALUES('2', 'Apples', '1', 'N'); 
INSERT INTO `category` VALUES('3', 'Furniture', '0', 'N'); 
INSERT INTO `category` VALUES('4', 'Toys', '0', 'N'); 
INSERT INTO `category` VALUES('5', 'Gifts', '4', 'Y'); 

和权限表的表结构

权限

CREATE TABLE IF NOT EXISTS `permissions` (
    `catid` varchar(170) NOT NULL, 
    `permission_object` enum ('seller', 'buyer') NOT NULL, 
    `permission_object_id` varchar(170) NOT NULL, 
    KEY `idx_wss` (`catid`) 
); 


INSERT INTO `permissions` VALUES('1', 'seller', '100'); -- Here category 1 is accessible to 'seller' object with ID 100 
INSERT INTO `permissions` VALUES('1', 'buyer', '300'); -- Here category 1 is accessible to 'buyer' object with ID 300 

INSERT INTO `permissions` VALUES('2', 'buyer', '200'); -- Here category 2 is accessible to 'buyer' object with ID 200 

INSERT INTO `permissions` VALUES('3', 'buyer', 'all'); -- Here category 3 is accessible to all 'buyer' objects 
INSERT INTO `permissions` VALUES('3', 'seller', 'all'); -- Here category 3 is accessible to all 'seller' objects 

正如你所看到的类别表是如何在权限表中引用和类别可以通过一个ID的对象类型或所有对象类型时,对象ID设置为可以访问“所有”

这是查询到目前为止,我已经得到

SELECT id, name, p. * 
FROM `catalogue` c 
LEFT JOIN permissions p ON p.cat = c.catid 
AND (
     (
      (
       p.permission_object_id = 'all' 
       OR p.permission_object_id = '100' 
      ) 
       AND p.permission_object = 'seller' 
     ) 
     OR 
     (
      (
       p.permission_object_id = 'all' 
       OR p.permission_object_id = '100' 
      ) 
       AND p.permission_object = 'buyer' 
     ) 
    ) 
WHERE catid = 3 

问题

上面的查询类型的作品 - 如如果类别3可由买方ID 100访问 - 它会显示它下面的内容。如果这个类别被允许买方ID为'all',那么任何买方都可以看到这个类别。

但问题是当我有子类别。因此,如果类别3可以通过'all'访问,然后我添加两个子类别4和5(类别3下),并告诉它继承来自父类的4和子类别5的权限,只能通过'seller'ID 200访问 - 那么我不明白在这里做什么。

  • 我是否需要标记为继承父权限时复制所有父权限,并插入新行(很明显,新的类别ID).... OR ....我可以以某种方式使用相同的查询有一些变化(我不知道该怎么做)。

  • 对上述任何其他更改/建议将不胜感激。

+0

有什么建议吗? – user1421214

回答

0

这将只处理子分类的一个层次,即如果添加的子类别,类别4 & 5.

它应该让你开始了,虽然如果我的理解是行不通的问题正确:

-- Assuming category 5 is a sub-category of category 3 and has inherit_parent_perms='Y' 

select * 
from 
(
-- select permisssions for this category 
SELECT c.catid, c.name, p.permission_object,p.permission_object_id 
FROM `category` c 
LEFT JOIN `permissions` p ON p.catid = c.catid 
where c.catid = 5 
union 
-- select permissions from parent category if it exists 
SELECT c.catid, c.name, p.permission_object,p.permission_object_id 
FROM `category` c 
inner join `category` parent on c.parent_catid = parent.catid and c.inherit_parent_perms='Y' 
LEFT JOIN `permissions` p ON p.catid = parent.catid 
WHERE c.catid = 5 
) all_perms 
WHERE (
     (
      (
       all_perms.permission_object_id = 'all' 
       OR all_perms.permission_object_id = '100' 
      ) 
       AND all_perms.permission_object = 'seller' 
     ) 
     OR 
     (
      (
       all_perms.permission_object_id = 'all' 
       OR all_perms.permission_object_id = '100' 
      ) 
       AND all_perms.permission_object = 'buyer' 
     ) 
    ); 
+0

感谢您的回答--4和5确实有子类别,但让我检查一下,看看它是否有效 – user1421214