2016-03-15 199 views
1

不幸的是我不像SQL那麼好,我試圖在三個表之間建立一個連接。加入三(3)個MySQL表

這裏是一個粗略的簡化表結構:

links: id, url, description 
categories: id, name, path 
link_cat: link_id, cat_id 

我的目標select語句應該有

links.id, link.url, link.description, categories.name, categories.path 

如果鏈接和類別通過link_cat表匹配。我認爲只要每個環節只有一個類別,就不應該太難。這是我所假設的。如果不是,則可以採用另一種方法將多個類別逗號分隔到categories.name字段中。

我希望這都是可以理解的,聽起來不會太愚蠢。

回答

1
SELECT links.id, links.url, links.description, categories.name, categories.path 
FROM links 
INNER JOIN link_cat ON links.id = link_cat.links_id 
INNER JOIN categories ON categories.id = link_cat.category_id 
+0

打我10秒! :) – sadmicrowave

+0

就是這樣。感謝您的輸入。我已經在帕里斯的答覆之後自己解決了這個問題,這個問題有點不太正確,但是你的問題已經解決了。 – Helmi

+0

實際上,這個查詢是壞的:-) http://sqlfiddle.com/#!9/6a81e/2 – Alex

1
# Add each field you want to the select list 
SELECT links.id, link.url, link.description, categories.name, categories.path 

# Add the "links" table to the list of tables to select from 
FROM links 

# Add the "link_cat" table, specify "link_id" as the common field 
JOIN link_cat USING (link_id) 

# Add the "categories" table specifying the "cat_id" as the common field 
JOIN categories USING (cat_id) 
+0

謝謝,您輸入給出了一些很好的提示,但沒有工作得非常好。我雖然用它來谷歌了一下,發現了它。雖然菲利普在釘上正確的幾個帖子後。 – Helmi

+0

我很高興你有一個可行的答案,但我不確定菲利普的答案在下面是你要找的。即使它沒有爲重複的表別名拋出錯誤,它也會有冗餘笛卡爾連接。 –

0
SELECT link.id, link.url, link.description, categories.name, categories.path 
FROM link, categories, link_cat 
WHERE 
    link.id = link_cat.link_id 
    AND categories.id = link_cat.category_id 
+1

現在ANSI-89樣式應該避免代替ANSI-92。 (https://36chambers.wordpress.com/2014/02/18/t-sql-anti-patterns-ansi-89-joins/) –

+0

您的示例工作正常,但未命中FROM中的link_cat表。隨着插入它的作品。謝謝。 – Helmi

+0

@Parris Verney謝謝!他們在那篇文章中寫得很好。我會適應.​​.. – obe

1

http://sqlfiddle.com/#!9/6a81e/1

SELECT 
    l.id, 
    l.url, 
    l.description, 
    c.name, 
    c.path 
FROM links l 
INNER JOIN link_cat lc 
ON lc.link_id = l.id 
INNER JOIN categories c 
ON lc.cat_id = c.id 
1
SELECT links.id, links.url, links.description, categories.name, categories.path 
FROM links 
INNER JOIN link_cat  ON link_cat.link_id = links.id 
INNER JOIN categories ON link_cat.cat_id = categories.id