2016-07-29 67 views
1

存在我有我的參與,像這樣的工作:MySQL的 - 連接 - 顯示數據時,不會在其他表

SELECT * 
FROM fixtures f, 
    channel c, 
    fixture_channel_join fcj 
WHERE f.matchday = '1' 
AND f.fixtures_id = fcj.fixture_id 
AND fcj.channel_id = c.id 

然而,這隻能說明在此通道和fixture_channel_join數據行。是否有可能顯示來自燈具的所有數據,並且如果沒有連接只顯示空列中的數據?

感謝

+2

*不要*的'FROM'子句中使用逗號。 *總是*使用正確的,明確的'JOIN'語法。 –

回答

1

你在那裏做了什麼是一個隱含的連接,這是一個INNER JOIN。這很難閱讀和有點混亂,我建議反對它。

您正在尋找LEFT JOINRIGHT JOIN。 的LEFT JOIN讓你在左側的所有值,在結果的右側部分與NULL填充:

SELECT * 
FROM fixtures f, 
LEFT JOIN fixture_channel fcj ON f.fixtures_id = fcj.fixture_id 
LEFT JOIN channel c ON fcj.channel_id = c.id 
WHERE f.matchday = '1' 

這將使你在fixtures表中的所有值(包括那些不匹配),然後是fixture_channel表中的匹配值(其中NULL值不存在任何匹配),然後是channe l表中的匹配值(其中NULL值不存在任何匹配)。

或者,RIGHT JOIN會給你所有值從右側,左側與NULL填充:

SELECT * 
FROM fixtures f, 
RIGHT JOIN fixture_channel fcj ON f.fixtures_id = fcj.fixture_id 
RIGHT JOIN channel c ON fcj.channel_id = c.id 
WHERE f.matchday = '1' 

這將使你在channel表中的所有值(包括那些不匹配) ,前面是fixture_channel表中的值(NULL值與不匹配任何通道的那些人的值),前面是fixture表中的值(具有不匹配燈具的fixture_channel值的NULL值)。我們反過來說明它是從右到左。

更多關於加入here,圖文並茂:)

+0

感謝您的詳細答案,它真的有幫助! – BCLtd

+1

不客氣。找到一些我建議的文檔,並對連接有一個很好的理解。如果做得對,它們非常強大。另外,作爲一個快速提示,不要忘記在您加入的列上添加索引,這確實有助於提高性能。乾杯! – evilpenguin

1

使用left join

SELECT * 
FROM fixtures f 
LEFT JOIN fixture_channel_join fcj ON f.fixtures_id = fcj.fixture_id 
LEFT JOIN channel c ON fcj.channel_id = c.id 
WHERE f.matchday = '1' 
+0

謝謝你的工作 – BCLtd

1

嘗試使用LEFT OUTER JOIN。

SELECT * 
FROM fixtures f 
LEFT OUTER JOIN fixture_channel_join fcj ON f.fixtures_id =fcj.fixture_id 
LEFT OUTER JOIN channel c ON fcj.channel_id = c.id 
WHERE f.matchday = '1' 
相關問題