在缩减表上获取加入 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
的所有内容 post
为 tags
(在 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
我的 3 table 人:
帖子
标签:
post2tags:
所以在 posts
table 中我没有引用任何与 tags
相关的内容。而在 tags
table 中,没有对 posts
的引用。我创建了一个新的 table、posts2tags
并在那里为 tags
引用了 posts
。
问题:这是正确的做法吗? tags
table 中的 posts
是否需要参考,反之亦然?
我想要实现的是 return 从 posts
table 到所有 tag
names
的所有内容 post
为 tags
(在 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