2016-08-23 2 views
0

액세스 시스템을 만들고 있습니다. 액세스 시스템은 사용자가 둘 이상의 그룹의 구성원이 될 수 있다는 것을 기반으로하며 도메인은 사용자가 액세스를 요청하는 곳입니다. 예를 들어 사용자는 두 그룹의 구성원 일 수 있으며이 두 그룹은 도메인에 대한 액세스 권한을 가질 수 있으며 사용자는 도메인의 구성원 일 수 있습니다. 가장 낮은 액세스 권한을 유효하게하고 싶습니다. 다른 권한보다 우선해야하는 해당 도메인에서 오른쪽 아래에있는 그룹에 추가됩니다.값의 하위 집합에서 여러 개의 최소값 선택

문제는 각 도메인을 선택하고 각 도메인에 대한 모든 액세스 권한을 얻고 싶다는 것입니다. 문제는 여러 하위 집합에서 최소값을 선택하는 것입니다. 이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

은 그래서 나는 시도했다 :

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 데이터 형식)을 사용하는 것이 좋습니다. 간단한 비트 연산을 사용하면 도메인에 대한 전반적인 액세스 권한을 얻을 수 있습니다.

관련 문제