我的3张桌子:
帖子
标签:
post2tags:
所以在posts
表中我没有提到与tags
相关的任何内容。在tags
表中,没有posts
的参考。我创建了一个新表posts2tags
,并在那里引用了posts
tags
。
问题:这是正确的方法吗?我是否需要在posts
表中提供tags
的任何参考,反之亦然?
我想要实现的是返回posts
表格中的所有内容以及tag
引用names
的所有post
tags
({ {1}}表格,并在结果中的posts2tags
中包含所有标记names
。像这样:
尝试:
array/single row
结果:
我正在学习加入多个表并将表格只减少到所需的信息。所以也在寻找建议。
答案 0 :(得分: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逻辑,仅显示一次post并显示其标记。
另一种hacky方式是使用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