2011-10-31 81 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

您的加入只会返回其ID在case_users和case_groups这两种情况下.. 如果一方或另一方,那么你就需要2个查询,您可以UNION获得在一个单一的所有结果结果集:

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