2017-05-09 23 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