2011-10-06 4 views
1

다음 쿼리는 주어진 문서와 관련된 ID, 문서와 관련된 사람이 읽을 수있는 권한 목록, 그룹의 ID를 포함하는 문자열, 역할 및 문서에서 해당 권한이 할당 된 사용자 (이 권한 할당 방법은 불필요한 것으로 알고 있습니다.), 모든 사람이 REGEXP 확인을 통해 액세스 할 수 있는지 여부를 결정합니다. 1 = 예, 모두가이 문서에 대한 권한에 액세스해야합니다. 0 = 모두가 아닙니다.서브 쿼리에 대한 참조로 MySQL의 csv id 문자열 분리하기

SELECT 
    `D`.`id` AS `docID`, 
    `P`.`human_name` AS `permissionName`, 
    `PD`.`descriptor_text` AS `permissionAssignments`, 
    `PD`.`descriptor_text` REGEXP '.*role\\((-4,)?-3.*' AS `everyoneAccess` 
FROM `documents` AS `D` 
INNER JOIN `permission_lookups`   AS `PL` ON `D`.`permission_lookup_id` = `PL`.`id` 
INNER JOIN `permission_lookup_assignments` AS `PLA` ON `PL`.`id` = `PLA`.`permission_lookup_id` 
INNER JOIN `permission_descriptors`  AS `PD` ON `PLA`.`permission_descriptor_id` = `PD`.`id` 
LEFT JOIN `permission_descriptor_roles` AS `PDR` ON `PDR`.`descriptor_id` = `PD`.`id` 
LEFT JOIN `permissions`     AS `P` ON `PLA`.`permission_id` = `P`.`id` 
WHERE `D`.`id` = 74; 

이러한 특정 쿼리의 출력이 비슷 :

3 열에서
74 Read   group(1)role(-3)user(13,14,26,38,56,73,81,88,103,108,138,140,148,158,159,175,191,276,294,15389) 1 
74 Write   group(1)user(13,14,26,38,56,73,81,88,103,108,138,140,148,158,159,175,191,276,294)   0 
74 Add Folder group(1)user(13,14,26,38,56,73,81,88,103,108,138,140,148,158,159,175,191,276,294)   0 
74 Manage security group(1)user(13,14,26,38,56,73,81,88,103,108,138,140,148,158,159,175,191,276,294)   0 
74 Delete   group(1)user(13,14,26,38,56,73,81,88,103,108,138,140,148,158,159,175,191,276,294)   0 
74 Manage workflow group(1)user(13,14,26,38,56,73,81,88,103,108,138,140,148,158,159,175,191,276,294)   0 
74 Folder Details group(1)role(-3)user(13,14,26,38,56,73,81,88,103,108,138,140,148,158,159,175,191,276,294,15389) 1 
74 Rename Folder group(1)                     0 

, 첫 번째 행 (예를 들어), 문자열 : group(1)role(-3)user(13,14,26,38,56,73,81,88,103,108,138,140,148,158,159,175,191,276,294,15389) 이드 1 그룹이 액세스 수단 읽기 권한, ID -3 역할은 읽기 권한에 대한 액세스 권한 (-3은 모두를 의미 함)을 가지며 해결 된 상태에서 ID가 13,14,26,38,56, 73,81,88,103108138140,148,158,159,175,191,276,294,15389에 액세스 할 수 있습니다. 따라서이 경우 모든 사용자에게 할당 된 모든 역할을 가진 문서로 인해 모든 사용자가 액세스 할 수 있지만 긴 사용 자 문자열에 대한 모든 액세스 권한을 담은 담요로 액세스 할 수 있습니다.

내가하고 싶은 일은 사용자의 CSV 목록을 꺼내어 하위 쿼리에서 사용하여 같은 쿼리에서 사용자 이름을 추출하는 것입니다.

SELECT 
    `D`.`id` AS `docID`, 
    `P`.`human_name` AS `permissionName`, 
    `PD`.`descriptor_text` AS `permissionAssignments`, 
    `PD`.`descriptor_text` REGEXP '.*role\\((-4,)?-3.*' AS `everyoneAccess`, 
     IF(`PD`.`descriptor_text` REGEXP '.*user\\([0-9,]+)$', 
      (SELECT group_concat(`username`) FROM users where `id` IN 
       (
        SUBSTR(
         `PD`.`descriptor_text`, 
         INSTR(`PD`.`descriptor_text`, 'user(') + 5, 
         LENGTH(`PD`.`descriptor_text`) - INSTR(`PD`.`descriptor_text`, 'user(') - 5 
        ) 
       ) 
      ), 
      NULL 
     ) 
FROM `documents` AS `D` 
INNER JOIN `permission_lookups`   AS `PL` ON `D`.`permission_lookup_id` = `PL`.`id` 
INNER JOIN `permission_lookup_assignments` AS `PLA` ON `PL`.`id` = `PLA`.`permission_lookup_id` 
INNER JOIN `permission_descriptors`  AS `PD` ON `PLA`.`permission_descriptor_id` = `PD`.`id` 
LEFT JOIN `permission_descriptor_roles` AS `PDR` ON `PDR`.`descriptor_id` = `PD`.`id` 
LEFT JOIN `permissions`     AS `P` ON `PLA`.`permission_id` = `P`.`id` 
WHERE `D`.`id` = 74; 
이 그 네번째 필드에서 변경할 수 있습니다 무엇

그것을 해제를 기반으로 사용자 이름의 GROUP_CONCAT의 목록에 대한 쿼리를 가지고 : 나는 다음과 같은 쿼리를 시도했지만 운이없이, 그것은 단지 CSV 목록에 첫 번째 사용자를 반환 이드의 CSV는?

+0

현재 작동하지 않는 이유는 'IN'이 입력 한 문자열 (위의 행 1에 대해 '13,14,26,38,56,73,81,88,103108138140,148,158,159,175,191,276,294,15389')과 일치하도록 노력하고 있기 때문입니다. 실제로 가치 목록이 필요합니다. [MySQL Reference Manual] (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html)에서 문자열 분할과 관련하여 좋은 논의가 있었지만 어떻게해야할지 모르겠습니다. 너의 상황에 그것을 적용하기 위하여. – raistlin0788

답변

1

이 될 것이라고 약속 할 수는 없지만 문제가 해결 될 것으로 생각됩니다.

SELECT 
    `D`.`id` AS `docID`, 
    `P`.`human_name` AS `permissionName`, 
    `PD`.`descriptor_text` AS `permissionAssignments`, 
    `PD`.`descriptor_text` REGEXP '.*role\\((-4,)?-3.*' AS `everyoneAccess`, 
    IF(`PD`.`descriptor_text` REGEXP '.*user\\([0-9,]+)$', 
     (SELECT group_concat(`username`) FROM users where `PD`.`descriptor_text` 
      REGEXP CONCAT('user[(0-9,]*[(,]', `id`, '[\),]') 
     ), 
     NULL 
    ) 
FROM `documents` AS `D` 
INNER JOIN `permission_lookups`   AS `PL` ON `D`.`permission_lookup_id` = `PL`.`id` 
INNER JOIN `permission_lookup_assignments` AS `PLA` ON `PL`.`id` = `PLA`.`permission_lookup_id` 
INNER JOIN `permission_descriptors`  AS `PD` ON `PLA`.`permission_descriptor_id` = `PD`.`id` 
LEFT JOIN `permission_descriptor_roles` AS `PDR` ON `PDR`.`descriptor_id` = `PD`.`id` 
LEFT JOIN `permissions`     AS `P` ON `PLA`.`permission_id` = `P`.`id` 
WHERE `D`.`id` = 74; 

문자열을 분리하려고 시도하는 대신 신중하게 구성된 정규 표현식을 사용하여 문자열에서 ID를 검색합니다.

+0

훌륭하고 매력적이었습니다! 감사! – Scott