获得所有结果在简化表上加入MySQL

时间:2017-09-25 12:37:16

标签: mysql rdbms node-mysql

我的3张桌子:

帖子

enter image description here

标签:

enter image description here

post2tags:

enter image description here

所以在posts表中我没有提到与tags相关的任何内容。在tags表中,没有posts的参考。我创建了一个新表posts2tags,并在那里引用了posts tags

问题:这是正确的方法吗?我是否需要在posts表中提供tags的任何参考,反之亦然?

我想要实现的是返回posts表格中的所有内容以及tag引用names的所有post tags({ {1}}表格,并在结果中的posts2tags中包含所有标记names。像这样:

enter image description here

尝试:

array/single row

结果:

enter image description here

我正在学习加入多个表并将表格只减少到所需的信息。所以也在寻找建议。

1 个答案:

答案 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