2014-07-21 5 views
0

다음 테이블에서 다음 논리에 따라 지정된 그룹에서 허용 된 사용자 목록을 가져와야합니다.단일 mysql에서 그룹으로 사용자를 가져 오기 (허용) 쿼리

  • 사례 1 : 일치하지 않는 경우 모든 사용자가 자격을 취득합니다 ( user_group 테이블에 레코드 없음).
  • 사례 2 : 일치 할 그룹의 사용자는 ( 배제를 가진 = 0) user_group 테이블에
  • 사례 3 : 거부가 아닌 다른 그룹의 사용자 (가진 배제 = 1)

참고 MyUser

user_id | user_name 
    1  | a 
    2  | b 
    3  | c 

MyGroup을

여기 User_Group

userid | groupid | exclusion 
    1  | 1  | 0 
    1  | 2  | 0 
    2  | 1  | 1 

998,131,253,

는 그 배제 = 1 레코드의 경우, 경우 1 & 3 작동하지만 2

SELECT u.id, g.id, g.code, ug.exclusion FROM MyUser u 
join MyGroup g 
LEFT JOIN user_group ug ON ug.group_id = g.id 
    AND ug.user_id = 1 -- works for user 2 and 3 but fails for user 1   
WHERE (ug.exclusion <> 0 OR ug.exclusion IS NULL) 

그래서 경우에 실패 쿼리 레코드 획득 및 기타 그룹은 널 조건으로 추가됩니다. 그리고 문제는 null 필드가 배타 = 0에 추가되어 전혀 필요하지 않다는 것입니다.

g1(a,c), g2(a,b,c), g3(b,c) 
+0

@strawberry ... 사용자 a는 그룹 1 및 2에서만 허용되므로 그룹 3에는 허용되지 않습니다. – Hakucha

답변

0

이 일을해야하거나, 가까운 일 : 우리가 단일 쿼리를

예상 결과를 사용하여 주어진 그룹에 대한 사용자의 목록을 얻을 수 있다면

제안하십시오.

select u.user_id, g.group_id, g.code 
from MyGroup g 
    cross join users u 
    left join user_group allowed ON u.user_id = allowed.user_id AND g.group_id = allowed.group_id AND allowed.exclusion = 0 
    left join user_group allowbydefault ON u.user_id = allowbydefault.user_id 
where (allowed.user_id is not null OR allowbydefault.group_id is null) 
-- and g.group_id = 1 -- uncomment to get everyone authorized for group #1 
-- and u.user_id = 35 -- uncomment to get every group that user #35 is authorized for 
group by u.user_id, g.group_id, g.code 

SQL 서버를 사용하여 테스트했지만 필자는 MySQL에 다른 공격 지점을 제공해야합니다.

+0

g1 (a, c), g2 (a, b, c), g3 (b, c) 세 그룹에 대한 예상 사용자 (괄호 안에 있음)이지만 쿼리에서 이러한 결과를 가져 오지 않습니다. ( – Hakucha

+0

이것은 아마도 가장 효율적인 방법은 아니지만 그룹 ID 대신 사용자 ID를 끄기 위해 두 번째 왼쪽 조인을 변경했습니다. '왼쪽 가입 user_group allowbydefault ON u.user_id = allowbydefault.user_id' 대신 : '왼쪽 ​​user_group 가입 allowbydefault ON g.group_id = allowbydefault.group_id' 해당 사용자가 아닌 경우이 사용자에게 모든 권한을 부여합니다 권한 테이블 – ludwigmace