2015-05-27 27 views
-1

我正在構建超級英雄數據庫。我想將每個單獨的表連接在一起,以便用戶可以搜索任何內容,而不必每次執行查詢時都要執行INNER JOIN。使用內部聯接的MySQL搜索結果

例如,用戶可以搜索超級英雄來自的漫畫系列,您只需更改SELECT和WHERE子句即可。

一個超級英雄的力量搜索時,這將返回一個好的結果:

SELECT sh.heroName, pwr.name FROM superhero sh 
INNER JOIN superheroPower sh_pwr ON sh.id = sh_pwr.superheroID 
INNER JOIN power pwr ON sh_pwr.powerID = pwr.id 
WHERE sh.heroName = 'Superman'; 

這將返回一個空集:

SELECT sh.heroName, pwr.name FROM superhero sh 
INNER JOIN superheroPower sh_pwr ON sh.id = sh_pwr.superheroID 
INNER JOIN power pwr ON sh_pwr.powerID = pwr.id 
INNER JOIN superheroAffiliation sh_aff ON sh.id = sh_aff.superheroID 
INNER JOIN affiliation aff ON sh_aff.affiliationID = aff.id 
INNER JOIN superheroComic sh_c ON sh.id = sh_c.superheroID 
INNER JOIN comic c ON sh_c.comicID = c.id 
INNER JOIN publisher pub ON c.publisherID = pub.id 
INNER JOIN comicAuthor c_a ON c.id = c_a.comicID 
INNER JOIN author a ON c_a.authorID = a.id 
WHERE sh.heroName = 'Superman'; 

有沒有辦法與所有表的搜索數據庫中已經內部聯合在一起?我應該做一個LEFT JOIN或者一個不同類型的JOIN嗎?

+1

使用左連接.. –

+1

「所有表都已內連接」?是...定義一個包含所有連接的視圖。 '從視圖中選擇foo = bar' –

+0

@MarcB,您好,請您告訴我們爲什麼查看會比查詢中的所有內部聯接更好? –

回答

1

如果在任何地方都沒有NULL(例如,連接中的每個鏈接總是有另一邊的東西),那就行了。

但是,因爲它是INNER,任何情況下,連接的一端都沒有結果會消除行(非匹配行不會在INNER連接中顯示)。

因此,要回答你的直接問題,假設你關心的關鍵是heroName,你應該從超級英雄開始,並將其他所有事情都留下。如果您希望能夠使用任何字段作爲關鍵字,則應該在所有連接上使用完全外部。