2016-08-23 11 views
0

アクセスシステムを作成しています。アクセスシステムは、ユーザーが複数のグループのメンバーになることができることに基づいており、ドメインはユーザーがアクセスを要求する場所です。たとえば、ユーザーは2つのグループのメンバーになることができ、これらのグループは両方ともドメインへのアクセス権を持ち、ユーザーはドメインのメンバーになることができます。私は最も低いアクセス権を有効なものにしたい、つまり、その権利が他の権利よりも先にあるべきである、そのドメインの右下にあるグループに追加されるとします。値のサブセットから複数の最小値を選択する

問題は、私は各ドメインを選択し、各ドメインのすべてのアクセス権を取得したいということです。 問題は、複数のサブセットから最小値を選択することです。これを行う方法を考えましたか?

ので、私は試してみました:

SELECT r.* FROM `domain` as d 
INNER JOIN ( 
    SELECT domain, min(`update`) FROM `right` 
    ) r ON d.name = r.domain; 

これは私に結果を与える:私が欲しいもの

ドメイン分(update

別のテストを真

は以下のとおりです。

ドメイン分(update

別のテスト真

いくつかの名前真

SQLのフィドルリンク:テスト値を持つSQLテーブルのhttp://sqlfiddle.com/#!9/841183

輸出:

CREATE TABLE `domain` (
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `displayName` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `description` varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `created_at` timestamp NULL DEFAULT NULL, 
    `updated_at` timestamp NULL DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

ALTER TABLE `domain` 
    ADD PRIMARY KEY (`name`); 

CREATE TABLE `groups` (
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `created_by` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `created_at` timestamp NULL DEFAULT NULL, 
    `updated_at` timestamp NULL DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

ALTER TABLE `groups` 
    ADD PRIMARY KEY (`name`), 
    ADD KEY `groups_created_by_foreign` (`created_by`); 


CREATE TABLE `right` (
    `domain` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `group` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `read` tinyint(1) NOT NULL, 
    `update` tinyint(1) NOT NULL, 
    `create` tinyint(1) NOT NULL, 
    `delete` tinyint(1) NOT NULL, 
    `modify` tinyint(1) NOT NULL, 
    `execute` tinyint(1) NOT NULL, 
    `created_by` varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `created_at` timestamp NULL DEFAULT NULL, 
    `updated_at` timestamp NULL DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

ALTER TABLE `right` 
    ADD PRIMARY KEY (`domain`,`group`), 
    ADD KEY `right_group_foreign` (`group`), 
    ADD KEY `right_created_by_foreign` (`created_by`); 


INSERT INTO `domain` (`name`, `displayName`, `description`, `created_at`, `updated_at`) VALUES 
('Another test', 'Another test', NULL, '2016-08-22 12:05:06', '2016-08-22 12:05:06'), 
('Some Name', 'Some Name', NULL, '2016-08-19 03:57:00', '2016-08-19 03:57:00'); 


INSERT INTO `groups` (`name`, `created_by`, `created_at`, `updated_at`) VALUES 
('groupTest', NULL, '2016-08-22 12:06:48', '2016-08-22 12:06:48'), 
('testGroup', NULL, '2016-08-19 03:56:35', '2016-08-19 03:56:35'); 


INSERT INTO `right` (`domain`, `group`, `read`, `update`, `create`, `delete`, `modify`, `execute`, `created_by`, `created_at`, `updated_at`) VALUES 
('Another test', 'groupTest', 0, 1, 0, 0, 0, 0, NULL, '2016-08-22 12:07:02', '2016-08-22 12:07:02'), 
('Another test', 'TestGroup', 1, 1, 0, 0, 0, 0, NULL, '2016-08-22 12:06:04', '2016-08-22 12:06:04'), 
('Some Name', 'TestGroup', 0, 1, 0, 0, 0, 0, NULL, '2016-08-19 03:57:05', '2016-08-19 03:57:05'); 

答えて

1

ミニを取得するにはgroup by句を使用する必要がありますグループごとに値を設定します。

select d.name, min(`update`) as min_update_right 
from domain d 
inner join `right` r on d.name = r.domain 
group by d.name 

ドメインテーブルから追加のフィールドが選択リストに存在することにしたい場合は、あなたが同様にリストして、グループにこれらのフィールドを追加する必要があります。ここではグループによって私はドメインを意味します

しかし、アクセス権を格納するために複数のフィールドの代わりにビットマップ(またはMySQLの場合はset)を使用することを検討します。単純なビット単位の操作では、ドメインへの全体的なアクセス権を得ることができます。

関連する問題