2017-09-25 199 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