获取在所有结果中加入在MySQL上减少表
问题描述:
我的3个表:获取在所有结果中加入在MySQL上减少表
帖子
标签:
post2tags:
所以在posts
表我并没有提及有关tags
什么。并且在tags
表中,没有参考posts
。我创建了一个新表posts2tags
,并在那里引用了posts
的tags
。
问题:这是正确的方法吗?我需要在tags
表中有posts
的任何参考,反之亦然?
我想达到的目标是从posts
表和所有tag
names
其中post
为tags
引用在array/single row
在返回结果一切(在posts2tags
表),并拥有所有的标签names
。就像这样:
尝试:
SELECT p.idPost, p.title, t.name from posts as p, tags as t, post2tags
WHERE t.idTags=post2tags.idTags
结果:
我学联合多个表和表减少到仅所需信息fr噢它。所以也要寻找建议。
答
是它正确的方式来存储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