SQL多个包含连接

时间:2011-10-31 15:21:49

标签: sql join

以下是架构描述。我想构建一个查询,对于给定的用户,将返回通过case_users直接共享或通过case_groups表间接共享的所有案例。这是我的尝试,在那里我将用户所属的组拉到前面:

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 个答案:

答案 0 :(得分: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>')
相关问题