2013-06-23 35 views
0

我有一個機器表和一個表,表示這些機器跨越時間的可達性。使用MySQL加入來顯示不相關的記錄

machines 
id name 
1  machine1 
2  machine2 
3  machine3 
4  machine4 

machines_reachability 
machine_id is_reachable time 
1    0    (whatever) 
2    1    (whatever) 
3    0    (whatever) 
1    1    (whatever) 
2    0    (whatever) 
3    0    (whatever) 
1    1    (whatever) 
2    1    (whatever) 
3    1    (whatever) 

我試圖找到一個具有NO可達記錄機(即machine4)使用連接。這可以通過其他方式完成,但我需要通過連接來完成此操作,以更好地理解它。

我嘗試以下

SELECT * FROM machines m LEFT OUTER JOIN machines_reachability mr ON m.id = mr.machine_id 

我明白,這應該輸出整個左表內容(即機器)和OUTER關鍵字應排除基於所述machinesmachines_reachability表之間的結果的交集條件m.id = mr.machine_id。但是這並沒有如我所料。它顯示所有內容但並不排除沒有匹配。

那麼我怎麼能運行一個JOIN查詢,實際上顯示沒有連接的行是否選擇性地是左表還是右表。

回答

1

選擇不同machines.names其中機自然左外連接machines_rechability其中is_reachable爲空

+0

如果我省略'where isacachable爲null',我找不到'is_reachable'值爲'null'的行。那麼這種情況如何起作用?! –

+0

如果刪除is_reachable爲空條件,那麼您將收到一張桌子 MACHINE1 機器2 Machine3 Machine4 –

0
SELECT * 
FROM machines m 
JOIN machines_reachability mr 
    ON (m.id <> mr.machine_id) 
GROUP BY m.id; 
+0

我試圖找到在'machines_reachability'表中沒有任何信息的'machines'。 –

+0

哦,對,沒有那樣。編輯。 –

0

怎麼樣

SELECT * from machines where not exists 
( 
     select machine_id from machines_reachability 
     where machines.id = machines_reachability.machine_id 
); 
+0

我需要使用'JOIN' –

+0

aha來完成它,並且我認爲結果是... –

+0

我實際上正在研究'JOINS',而不是試圖產生結果。 –

1

使用聯接:

select * 
from machines m left outer join 
    machines_reachability mr 
    on m.id = mr.machine_id and 
     mr.is_reachable = 1 
where mr.machine_id is NULL 

的想法是從所有機器開始。 left join保留第一個表中的所有記錄,即使是那些不匹配的記錄。當一臺機器可用時,第二個表中有一個匹配項(我假設記錄必須設置標誌以及在表中)。最後的where子句只保留第二個表中沒有匹配的機器。

+0

有一件事困惑我,如果我不被過濾'mr.machine_id IS NULL',我得到的所有行了' machine'表中,但不能從machine_id'等於'NULL'的'machines_reachability'表中刪除行。那麼爲什麼'WHERE mr.machine_id IS NULL'起作用呢?! –

+0

現在我明白了。謝謝。 –

+0

你和'約翰史密斯'回答了正確的答案,但他提前幾分鐘,我不得不接受他的回答是公平的。非常感謝你的時間:) –