2014-04-17 52 views
0

假設我有2個表。SQL條件內連接

Nav: 
----------- 
id INT NOT NULL, 
title VARCHAR(50) NOT NULL, 
target_page INT DEFAULT NULL; 

Pages: 
----------- 
id INT NOT NULL, 
url VARCHAR(200) NOT NULL, 
access_level INT NOT NULL; 

請注意,Nav中的target_page可以爲NULL。 如果我想同時選擇從導航我可以使用內部數據從頁面獲得URL加入:

SELECT Nav.id, Nav.title, Pages.url FROM Nav 
INNER JOIN Pages ON Pages.id = Nav.target_page 

如果我想添加一個額外的條件,讓說,該系統目前用戶只能看到網頁他們有機會獲得我可以添加一個額外條件:

SELECT Nav.id, Nav.title, Pages.url FROM Nav 
INNER JOIN Pages ON Pages.id = Nav.target_page 
WHERE Pages.access_level <= OurImaginaryUserLevel 

內部聯接確保用戶不具有行從鏈接到記錄在頁面誰的ACCESS_LEVEL比用戶的更大導航返回。

但是,Nav中的一些記錄具有NULL的target_page。即使INNER JOIN阻止它們被返回,我也想返回這些記錄,因爲Pages中沒有記錄,其ID爲NULL。

只有具有NULL的target_page的記錄免於INNER JOIN。只有當Pages表中的匹配項符合Pages.access_level條件時,纔會返回具有Not NULL target_page的記錄,因此我無法使用左連接。

如果我的要求很難理解,我很抱歉。隨意問任何問題。

在此先感謝

回答

2

我想你誤會LEFT JOIN - 在你的情況,你可以取代INNER JOINLEFT JOIN並得到同樣的結果!

爲了達到你想要什麼,你真正需要使用它,因爲你喜歡檢索Nav行沒有一個target_page,太:

SELECT Nav.id, Nav.title, Pages.url FROM Nav 
LEFT JOIN Pages ON Pages.id = Nav.target_page 
WHERE Pages.access_level <= 1 OR target_page IS NULL 

演示:http://sqlfiddle.com/#!2/69ed06/1

正如你所看到的,這將返回一個頁面級別爲1的導航欄,並且沒有任何頁面關聯。

+0

輝煌的工程太棒了!我忘記了使用左連接,無論是將條件放在WHERE子句還是ON子句之後,都很重要。非常感謝你! –

+0

很高興爲您服務。 :) –