2012-10-21 3 views
2

사용자 그룹을 저장하는 "group_names"테이블이 있습니다. 각 그룹에는 개별 사용자이거나 다른 그룹이 관리 할 수있는 관리자가 있습니다. 현재 group_names.mgr_type에 의해 결정됩니다. INT 값이 1이면 개별 사용자이고 값이 2이면 해당 값을 관리하는 그룹입니다.MySQL에서 SELECT 문을 사용하는 경우

예를 들어 "일반 사용자"그룹은 "IT 부서"그룹 또는 "John Doe"그룹에서 관리 할 수 ​​있습니다. users 및 group_names 테이블의 고유 ID 필드는 "user_id"및 "group_id"입니다.

나는 PHP에서 논리를 제거하고 SQL 쿼리에 넣기를 원하지만 여기서 문제가있다. 이 테이블 레이아웃 주어진 가능한 경우 또는 단순히 설명서를 제공하는 간단한 지침을 따르는 수없는 경우 확실하지 않습니다.

SELECT gn.group_id, gn.group_name, ... gn.mgr_id, CONCAT(usr.user_firstname,' ',usr.user_lastname) AS created_name, usr.user_id, 
CASE gn.mgr_type 
    WHEN '1' THEN CONCAT(usr.user_firstname,' ',usr.user_lastname) WHERE usr.user_id=gn.mgr_id LIMIT 1 
    WHEN '2' THEN gn.group_name WHERE gn.group_id=gn.mgr_id LIMIT 1 
END AS mgr_name 
FROM group_names gn 
LEFT JOIN users usr 
ON gn.created_by=usr.user_id 
ORDER BY group_name ASC; 

괄호의 유무에 관계없이 IF 및 CASE의 다양한 변형을 시도했지만 "잘못된 구문 오류"오류가 계속 발생합니다.

...for the right syntax to use near 'WHERE usr.user_id=gn.mgr_id LIMIT 1) WHEN '2' THEN (gn.group_name WHERE gn' at line 3 

나는 심지어합니다 (mgr_id = GROUP_ID에 따라 다른 행에서 GROUP_NAME을 선택) 같은 테이블에서 다른 행을 선택하거나 내가 다른 테이블을 추가해야합니까? 더 쉽고 효율적인 방법에 대한 제안이 있으십니까?

감사합니다.

답변

0

이미 해당 테이블에 결합하기 때문에이 시도했다

CASE gn.mgr_type 
    WHEN '1' THEN CONCAT(mgr_usr .user_firstname,' ',mgr_usr .user_lastname) 
    WHEN '2' THEN mgr_grp.group_name 
END AS mgr_name 

당신은 실제로 그

LEFT JOIN users mgr_usr 
    ON gn.mgr_id = mgr_usr.user_id 
LEFT JOIN group_names mgr_grp 
    ON gn.mgr_id = mgr_grp.group_id 

L을 작동하려면 2 개 왼쪽 조인 필요 EFT는 당신은 더

LEFT JOIN users mgr_usr 
    ON gn.mgr_id = mgr_usr.user_id AND gn.mgr_type = 1 
LEFT JOIN group_names mgr_grp 
    ON gn.mgr_id = mgr_grp.group_id AND gn.mgr_type = 2 
+0

빠른 답장을 보내 주셔서 감사합니다.이 솔루션이 가장 효과적이었습니다. – Curtis

0

나는 당신이 (여기서 테이블의 다른 인스턴스의 가입 조건에 변화 시도) 이런 식으로 뭔가를 시도해야한다고 생각 :

SELECT gn.group_id, gn.group_name, ... gn.mgr_id, 
     CONCAT(usr.user_firstname,' ',usr.user_lastname) AS created_name, 
     usr.user_id, 
     CASE gn.mgr_type 
     WHEN '1' THEN CONCAT(usr1.user_firstname,' ',usr1.user_lastname) 
     WHEN '2' THEN gn1.group_name 
     END AS mgr_name 
FROM group_names gn 
LEFT JOIN users usr 
ON gn.created_by=usr.user_id 
RIGHT OUTER JOIN users usr1 
ON usr1.user_id=gn.mgr_id LIMIT 1 
OUTER JOIN group_names gn1 
ON usr.user_id=gn1.mgr_id LIMIT 1 
ORDER BY group_name ASC; 
0

이 시도 조인 제한 할 수 있습니다 그룹

인 경우에 그룹 이름을 검색하는 것이 사용자의 경우 관리자 이름을 얻거나 테이블을 GROUP_NAMES에 가입 사용자 테이블에 조인

SELECT ... 
CASE WHEN gn.mgr_type = '1' 
    THEN CONCAT(usr.user_firstname,' ',usr.user_lastname) WHERE usr.user_id=gn.mgr_id LIMIT 1 
    ELSE gn.group_name WHERE gn.group_id=gn.mgr_id LIMIT 1 
    END AS mgr_name 
FROM group_names gn... 
관련 문제