2011-10-31 2 views
0

다음은 스키마 설명입니다. 주어진 사용자에 대해 case_users을 통해 직접 또는 case_groups 테이블을 통해 간접적으로 공유되는 모든 사례를 반환하는 쿼리를 작성하고 싶습니다.SQL 다중 포함 조인

SELECT * FROM `cases` 
INNER JOIN `case_users` ON `cases`.`id` = `case_users`.`case_id` 
INNER JOIN `case_groups` ON `cases`.`id` = `case_groups`.`case_id` 
WHERE `case_users`.`user_id` = '<USER_ID>' 
OR `case_groups`.`group_id` IN (<USER_GROUP_LIST>) 

EXPLAIN 반환 다음 : 그것은 어떻게 Impossible WHERE noticed after reading const table...

일을 내가 얻을 수있는 여기 내 시도는 내가 그룹을 끌어 경우 사용자는 선행에 속하는입니까? 이상적으로는 사용자가 속한 USER_GROUP_LIST - 그룹을 끌어 오지 않고 단일 샷으로 모든 사례를 검색하고 싶습니다.

mysql> describe users; 
+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
+-------------+--------------+------+-----+---------+----------------+ 

mysql> describe cases; 
+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
+-------------+--------------+------+-----+---------+----------------+ 

mysql> describe case_users; 
+-------------+---------+------+-----+---------+-------+ 
| Field  | Type | Null | Key | Default | Extra | 
+-------------+---------+------+-----+---------+-------+ 
| user_id  | int(11) | NO | PRI | NULL |  | 
| case_id  | int(11) | NO | PRI | NULL |  | 
+-------------+---------+------+-----+---------+-------+ 

mysql> describe case_groups; 
+-------------+---------+------+-----+---------+-------+ 
| Field  | Type | Null | Key | Default | Extra | 
+-------------+---------+------+-----+---------+-------+ 
| case_id  | int(11) | NO | PRI | NULL |  | 
| group_id | int(11) | NO | PRI | NULL |  | 
+-------------+---------+------+-----+---------+-------+ 

mysql> describe group_users; 
+-------------+---------+------+-----+---------+-------+ 
| Field  | Type | Null | Key | Default | Extra | 
+-------------+---------+------+-----+---------+-------+ 
| group_id | int(11) | NO | PRI | NULL |  | 
| user_id  | int(11) | NO | PRI | NULL |  | 
+-------------+---------+------+-----+---------+-------+ 

답변

1

귀하의 하나 또는 다른, 당신은이 쿼리는 UNION은 하나의 모든 결과를 얻을 수 있습니다 필요한 경우 .. 단지의 경우 그 ID가 case_users 및 case_groups 모두에 반환됩니다 조인 결과 :

SELECT `cases`.* FROM `cases` 
INNER JOIN `case_users` ON `cases`.`id` = `case_users`.`case_id` 
WHERE `case_users`.`user_id` = '<USER_ID>' 
UNION 
SELECT `cases`.* FROM `cases` 
INNER JOIN `case_groups` ON `cases`.`id` = `case_groups`.`case_id` 
WHERE `case_groups`.`group_id` IN (SELECT `group_users`.`group_id` 
            FROM `group_users` 
            WHERE `group_users`.`user_id` = '<USER_ID>') 
+0

아마도 'USER_GROUP_LIST'을 (를) 가져 오는 하위 쿼리를 추가 할 수 있습니까? 나는 그것이 질문의 일부라고 생각한다. (별도의 여행없이 동일한 쿼리에서 목록을 얻는 방법) –

+0

좋은 점, 쿼리가 업데이트되었습니다. – StevieG

+0

사례 사용자와 사례 그룹의 구조는 다르지만 결과에 파일이 포함되어 있습니다. 아마도 당신은 질의를 수정하려고 할 것입니다. – danihp