2017-02-21 52 views
-1

我在我的數據庫中有兩個表,一個是articles,另一種是articleMediaarticle表存儲的標題和正文,而articleMedia商店附件,每篇文章都可以有附件的任意數,articleMedia表有關使用外鍵這是artcle的id的articles表,所以我的表結構看起來像MySQL的使用加入

第二十表

---------------------------------- 
|id |title | body    | 
---------------------------------- 
|1 |houses|some houses are green| 

ArticleMedia表

---------------------------------- 
|id |articleFk | path    | 
---------------------------------- 
|1 |2   |/media/1.jpg  | 
|2 |2   |/media/house.mp4 | 

我查詢的技能是不是那麼好,所以我的查詢是

SELECT 
    article_tbl.id, title,body, articleMedia_tbl.path 
FROM `article_tbl` 
JOIN articleMedia_tbl ON article_tbl.id = articleMedia_tbl.articleFk 

,其輸出類似

------------------------------------------------------ 
|id | title | body | path   |     | 
------------------------------------------------------ 
|1 |houses|some houses are green |/media/1.jpg  | 
------------------------------------------------------ 
|2 |houses|some houses are green |/media/house.mp4 | 

有沒有辦法避免重複或更好的方法,我可以用什麼避免這一切?

+1

至於一個SQL結果集而言,是不復制。您希望結果如何構建?請發佈您想要實現的輸出示例。通常有必要使用應用程序代碼將SQL結果重新格式化爲除列/行的二維結構以外的任何內容。 –

+0

你究竟想從你的查詢中得到什麼?它不重複,因爲路徑是不同的值。 – r0xette

+0

我並沒有試圖獲得任何特別的東西,但是我的擔心是,有沒有更好的方法來獲取附件,而不必重複標題和正文的重複? – Chrome

回答

0

你指的是什麼重複?您似乎有一個1:N的關係,其中的文章可以有任何數量的媒體。通過將文章加入媒體,您可以將它們與匹配的兩個關聯起來。對於媒體表中的每個fk,您在文章表中都有一個匹配項,因此存在重複;你的查詢正在做你想要的。你可以通過改變你的投影(選定的列)來隱藏重複,只需要看你想要的。

什麼我認爲你正在接觸的是JOINS更有趣的危險,那就是CROSS JOIN。它的核心是一個連接表示兩個表的笛卡爾積。我們最多隻能加入1:N的關係,因爲我們可以接受來自1方的數據重複需求。如果我們加入了N:N,我們最終會得到兩者之間的所有組合(例如A:A,A:B,B:A,B:B等)。這可以通過關聯實體來解決。

要清楚,你沒有一個笛卡兒連接在這裏,但是,我發現在我的理解這是很有幫助的加入:

http://www.databasejournal.com/features/mysql/article.php/3901221/Identifying-and-Eliminating-the-Dreaded-Cartesian-Product.htm