2017-09-25 191 views
1

我的3個表:獲取在所有結果中加入在MySQL上減少表

帖子

enter image description here

標籤:

enter image description here

post2tags:

enter image description here

所以在posts表我並沒有提及有關tags什麼。並且在tags表中,沒有參考posts。我創建了一個新表posts2tags,並在那裏引用了poststags

問題:這是正確的方法嗎?我需要在tags表中有posts的任何參考,反之亦然?

我想達到的目標是從posts表和所有tagnames其中posttags引用在array/single row在返回結果一切(在posts2tags表),並擁有所有的標籤names。就像這樣:

enter image description here

嘗試:

SELECT p.idPost, p.title, t.name from posts as p, tags as t, post2tags 
WHERE t.idTags=post2tags.idTags 

結果:

enter image description here

我學聯合多個表和表減少到僅所需信息fr噢它。所以也要尋找建議。

回答

2

是它正確的方式來存儲ManyToMany關係聯結表(post2tags)將舉行帖子和標籤的引用來關聯它們。爲了讓你可以使用預期的結果左連接來獲取所有的帖子他們是否有標籤或不

select p.idPost, p.title, t.name 
from posts as p 
left join post2tags pt on (p.idPost = pt.idPost) 
left join tags t on (t.idTags = pt.idTags) 
order by p.idPost 

這將返回與他們相關的標籤的所有職位,都將被多次返回,因爲沒有。像

idPost title name 
------------------- 
1  test tag1 
1  test tag2 
2  test tag1 
2  test tag2 
3  test null 

分配標籤,然後在應用程序代碼按照你做一些的if/else邏輯,以顯示後只有一次,並顯示其標籤所需的格式可以顯示這些結果。

另一種方法是使用group_concat函數,它返回每個組的逗號分隔值列表,如下所示,但它具有字符長度的一些限制。

select p.idPost, p.title, group_concat(t.name) as `name` 
from posts as p 
left join post2tags pt on (p.idPost = pt.idPost) 
left join tags t on (t.idTags = pt.idTags) 
group by p.idPost 
order by p.idPost 

這會給你的結果,按您需要的視圖

idPost title name 
------------------- 
1  test tag1,tag2 
2  test tag1,tag2 
3  test null