2012-01-12 1 views
0

mySQL이 허용하는지 확실하지 않지만 궁금하다.저장 프로 시저없이 한 명령문의 조건에 따라 두 개의 다른 선택을 실행할 수 있습니까?

나는 간단한 ACL 데이터베이스를 가지고 있으며, 채널과 사용자가있다. 일부 사용자는 특정 채널에 액세스 할 수 있으며 다른 사용자는 모든 채널에 액세스 할 수 있습니다. 내가 선호하는 방법은 각 사용자의 채널에 대한 권한 테이블에 행을 포함하는 것이 아니라 사용자 행의 채널 ID 열이 NULL이면 모든 채널에 액세스 할 수 있도록 지정하는 것입니다. 즉 ...

channels 
1 | channelA 
2 | channelB 
etc... 

users_access 
1 | NULL // this user has access to all channels 
2 | 2 // this user only has access to channel 2 

는합니다 (NULL 기준) 사용자 1 (1)과 (2)를 반환하는 선택 및 단지 2 사용자 2를 작성하는 방법이 있나요?

또 다시 ... 나는 대안 디자인이 사용자 테이블에 권한이있는 각 채널에 대한 고유 한 행을 가지고 있다는 것을 알고 있지만 여러 가지 이유로 들어 오기를 원하지 않는다면, 전역 NULL 액세스 값을 갖는 것을 선호합니다.

TIA

답변

1
SELECT 
    uc.user_id 
    ch.chanell_id 
FROM 
    chanells AS ch 
    JOIN 
    users_access AS uc 
     ON uc.channel_id = ch.channel_id 

UNION ALL 

SELECT 
    uc.user_id 
    ch.chanell_id 
FROM 
    chanells AS ch 
    CROSS JOIN 
    users_access AS uc 
WHERE uc.channel_id IS NULL 

나 :

SELECT 
    uc.user_id 
    ch.chanell_id 
FROM 
    chanells AS ch 
    JOIN 
    users_access AS uc 
     ON uc.channel_id = ch.channel_id 
     OR uc.channel_id IS NULL 

또한 특정 채널에 액세스 할 수있는 사용자에 대한 정보에 대한 users_access을 유지하고 사용자를위한 users_global_access를 추가, 테이블을 재구성 할 수 모든 채널에 액세스 할 수 있습니다 (한 열만있는 경우 user_id 또는 start_date와 같은 기타 관련 정보 포함)

+0

두 번째 옵션은 내가 찾고있는 것입니다. 정말 고마워요! –

관련 문제