2017-05-09 53 views
0

我有三个连接的表。我需要做一个单一的SQL选择,我知道我需要使用某种形式的连接,但不是如何。我只希望如果用户ID的会话访问该object's区(用户获得访问权限,如果他们的公司进入该地区的)我的表格要选择的是的objectID:有条件的SQL从几个表中连接

+----------+--------+ Objects 
| objectID | areaID | 
+----------+--------+ 
|  1 |  2 | 
|  2 |  2 | 
|  3 |  3 | 
+----------+--------+ 
+-----------+--------+ Users 
| companyID | userID | 
+-----------+--------+ 
|   1 |  1 | 
|   1 |  2 | 
|   1 |  3 | 
+-----------+--------+ 
+-----------+--------+ Access 
| companyID | areaID | 
+-----------+--------+ 
|   1 |  1 | 
|   1 |  2 | 
|   1 |  3 | 
+-----------+--------+ 

回答

1

选择用户名和使用companyID在inner query中对应的区域ID。然后使用从对象表使用内通过inner query

形成表再次加入此,选择不同的ObjectID尝试此查询: -

Select distinct a.objectID 
from 
Objects a 
inner join 
(
Select a.*,b.areaID 
from 
Users a 
inner join 
Access b 
on a.companyID=b.companyID 
) b 
on a.areaID=b.areaID 
Where b.UserID= 1; 
+0

但是,在将我放在会话变量为活动user's用户ID? – KingleyMosso

+0

只需在用户名中添加“Where条件”即可。我更新了我的查询。以用户ID 1为例。如果你愿意,你可以改变它。 –

0

如果我理解你的权利,这似乎就像两个INNER JOIN功能会得到结果你要找的:

WITH ONE AS (
    SELECT a.companyID, a.userID, b.areaID 
    FROM Users a 
    INNER JOIN Access b 
    ON a.companyID = b.companyID 
    ) 

SELECT a.companyID, a.userID, a.areaID, b.objectID 
FROM ONE a 
INNER JOIN Objects b 
ON a.areaID = b.areaID; 

编辑:回复评论

如果你想限制结果为特定用户ID值,你需要一个WHERE条款:

WITH ONE AS (
    SELECT a.companyID, a.userID, b.areaID 
    FROM Users a 
    INNER JOIN Access b 
    ON a.companyID = b.companyID 
    ) 

SELECT a.companyID, a.userID, a.areaID, b.objectID 
FROM ONE a 
INNER JOIN Objects b 
ON a.areaID = b.areaID 
WHERE a.userID = ${specific_user_id}; 
+0

但我在哪里会把活动用户的用户ID的会话变量? – KingleyMosso

+0

我刚刚做了一个编辑,显示如何添加一个'WHERE'子句来做到这一点。 – nxl4