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