2013-01-18 49 views
0

假設一個網站根據它們發佈的媒體格式對流行故事進行分類。其數據庫包含以下表:從表A獲取項目,該項目通過表B鏈接到表C.三重聯接?

stories table

links table

enter image description here

應該使用什麼樣的查詢或查詢的檢索中,比如說形式發佈的所有故事標題,電影?

我認爲做這樣的事情的,但懷疑有一個更好的方法:

SELECT `story_id` 
FROM `links` INNER JOIN `media` 
    ON `links`.`medium_id` = `media`.`medium_id` 
    WHERE `media`.`medium_name` = :medium_name" 

for every retrieved story_id 
{ 
    SELECT `story_summary` FROM `stories` WHERE `story_id` = :story_id 
} 

任何幫助,將不勝感激!

回答

0
select s.story_title 
from stories s, links l, media m 
where m.medium_name = 'movie' and 
s.story_id = l.story_id and 
l.medium_id = m.medium_id 

這實質上與raheel發佈的查詢基本相同,只是語法不同。 故事和中型表格是不是直接連接在一起的原因?你的查詢和db可以簡化。

+0

哦,那可能是 - 我不是專家,不遠。如果每個故事可以有多種媒體形式,這將是設置表格的最佳方式。 這個語法對我來說似乎簡單得多,但是到目前爲止我還沒有得到它在我的項目中的工作......仍在嘗試。 – Chris

+0

還沒有在我的PHP腳本中工作,但如果我直接在PHPMyAdmin中運行查詢,它完美的工作。與(更復雜的?)JOIN相比,這種方法有什麼缺點嗎?我從來沒有真正使用JOIN,我必須承認,在多個查詢中,總是「手動」地完成某些事情。 – Chris

+1

我的查詢是一個較老的語法,暗示了連接的類型。查詢@raheel_shan發佈是一個新的語法,明確定義了連接類型。如果你要學習一個我會用更新的語法。 –

1

嘗試與此查詢,而不是(我增加了第三行和最後一個):

SELECT `story_id` FROM `links` 
INNER JOIN `media` ON `links`.`medium_id` = `media`.`medium_id` 
inner join stories on stories.story_ID=links.story_id 
WHERE `media`.`medium_name` = :medium_name 
and `story_summary`.`story_id` in (:all_the_story_id) 

all_the_story_id沒有把所有的story_id,看看到mysql in

如果您額外加入您將擁有所有您需要的信息,而且您無需爲每個結果進行查詢

1
SELECT 
    s.story_title 
FROM MEDIA as m 
LEFT JOIN LINKS as l ON l.medium_id = m.medium_id 
LEFT JOIN STORIES as s ON s.story_id = l.story_id 
WHERE m.medium_name = 'movie' 
+0

按照你的和Scotty Boy的建議去做。你能否向我解釋爲什麼需要一個左連接?我發現這種變化更具可讀性,使用INNER JOIN似乎很有效:http://codepad.org/rBlxBIyU – Chris

+0

LEFT和INNER之間有一點區別。 Inner獲取左表和右連接表中存在於兩個表中的記錄,而左連接始終獲取左表結果,如果記錄不存在,則右表獲取空結果。但是使用inner,記錄必須存在於這兩個表中 –