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 が「all」に設定されている場合はすべてのオブジェクト タイプによってアクセスできます。

これは私がこれまでに得たクエリです

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 が「すべて」によってアクセス可能であり、2 つのサブカテゴリ 4 および 5 (カテゴリ 3 の下) を追加し、「販売者」ID 200 のみがアクセスできる 4 およびサブカテゴリ 5 の親からアクセス許可を継承するように指示します。 - それでは、ここで何をすべきかわかりません。

  • 親のアクセス許可を継承するようにマークされている場合、すべての親のアクセス許可をコピーして新しい行として (明らかに新しいカテゴリ ID で) 挿入する必要がありますか?方法がわかりません)。

  • 上記に対するその他の変更/提案をいただければ幸いです。

4

1 に答える 1

0

これはサブカテゴリの 1 つのレベルのみを処理します。つまり、カテゴリ 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'
        )
    );
于 2013-01-16T11:38:02.673 に答える