在缩减表上获取加入 MySQL 中的所有结果

Getting all results in Join in MySQL on reduced tables

我的 3 table 人:

帖子

标签:

post2tags:

所以在 posts table 中我没有引用任何与 tags 相关的内容。而在 tags table 中,没有对 posts 的引用。我创建了一个新的 table、posts2tags 并在那里为 tags 引用了 posts

问题:这是正确的做法吗? tags table 中的 posts 是否需要参考,反之亦然?

我想要实现的是 return 从 posts table 到所有 tag names 的所有内容 posttags(在 posts2tags table 中)引用并在结果中的 array/single row 中包含所有标记 names。像这样:

尝试过:

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

结果:

我正在学习加入多个 table 并将 table 减少为仅需要其中的信息。所以也在寻求建议。

是的,它是存储 ManyToMany 关系的正确方法,结点 table (post2tags) 将保存 post 的引用和关联它们的标签。为了获得预期的结果,您可以使用左连接来获取所有 posts,无论它们是否有标签

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

这将 return 您所有 post 及其相关标签,每个都会被 return 多次编辑为否。分配的标签,例如

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

然后在应用程序代码中,您可以根据需要的格式显示这些结果,方法是执行一些 if/else 逻辑以仅显示 post 一次并显示其标签。

另一种 hacky 方法是使用 group_concat 函数,其中 return 以逗号分隔每组的值列表,如下所示,但它有一些字符长度限制。

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