多对多关系,使查询不那么复杂

发布于 2024-12-22 21:57:47 字数 1328 浏览 1 评论 0原文

这只是我的标签系统中使用的表格设计的一个示例。

ARTICLES
id
content

TAGS
id
tag

TAGSTOARTICLES
articleid
tagid

@edit 最后,经过一些rubberducking之后,我成功编写了以下查询:


仅选择文章:

SELECT a.id, a.content, GROUP_CONCAT(t.tag) AS tags
FROM articles a
LEFT JOIN tagstoarticles tta ON tta.articleid = a.id
LEFT JOIN tags t ON t.id = tta.tagid
GROUP BY a.id

结果:

id  content         GROUP_CONCAT(t.tag)
1   Lorem ipsum 1   tag1,tag2
2   Lorem ipsum 2   tag1
3   Lorem ipsum 3   tag2

搜索标签:

SELECT a.id, a.content, GROUP_CONCAT(t.tag) AS tags
FROM articles a
LEFT JOIN tagstoarticles tta ON tta.articleid = a.id
LEFT JOIN tags t ON t.id = tta.tagid
WHERE a.id IN (SELECT A.id FROM tagstoarticles M, articles A, tags T
               WHERE M.tagid = T.id
               AND (T.tag IN ('tag1'))
               AND A.id = M.articleid
               GROUP BY A.id
               HAVING COUNT( A.id )=1
)
GROUP BY a.id

结果:

id  content         GROUP_CONCAT(t.tag)
1   Lorem ipsum 1   tag1,tag2
2   Lorem ipsum 2   tag1

但是用于搜索标签的查询很混乱,有什么办法可以更轻松地解决这个问题吗?

This is just an example of the tables design used in my tags system.

ARTICLES
id
content

TAGS
id
tag

TAGSTOARTICLES
articleid
tagid

@edit Finally after some rubberducking I managed to write following queries:


Just selecting articles:

SELECT a.id, a.content, GROUP_CONCAT(t.tag) AS tags
FROM articles a
LEFT JOIN tagstoarticles tta ON tta.articleid = a.id
LEFT JOIN tags t ON t.id = tta.tagid
GROUP BY a.id

Result:

id  content         GROUP_CONCAT(t.tag)
1   Lorem ipsum 1   tag1,tag2
2   Lorem ipsum 2   tag1
3   Lorem ipsum 3   tag2

Searching for tags:

SELECT a.id, a.content, GROUP_CONCAT(t.tag) AS tags
FROM articles a
LEFT JOIN tagstoarticles tta ON tta.articleid = a.id
LEFT JOIN tags t ON t.id = tta.tagid
WHERE a.id IN (SELECT A.id FROM tagstoarticles M, articles A, tags T
               WHERE M.tagid = T.id
               AND (T.tag IN ('tag1'))
               AND A.id = M.articleid
               GROUP BY A.id
               HAVING COUNT( A.id )=1
)
GROUP BY a.id

Result:

id  content         GROUP_CONCAT(t.tag)
1   Lorem ipsum 1   tag1,tag2
2   Lorem ipsum 2   tag1

But the query used for searching for tags is a mess, any idea to solve this easier?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我一直都在从未离去 2024-12-29 21:57:47

“但是如何修改这个查询以同时选择分配给这篇文章的所有标签呢?”

SELECT tag FROM tags INNER JOIN tagstoarticles ON tags.id = tagstoarticles.tagid WHERE articleid=[your article's id]

“当我只想获得结果而不通过标签搜索时,该怎么做?”

SELECT articles.id, tags.tag FROM articles INNER JOIN tagstoarticles ON tagstoarticles.articleid = articles.id INNER JOIN tags ON tagstoarticles.tagid = tags.id ORDER BY articles.id, articles.date

这为每个标签提供了一个不同的结果行,因此您必须应用一些后处理才能将其转换为带有标签的文章列表。但是,通过按文章 ID 排序,您可以确保一篇文章的所有标签都一起返回。

"But how to modify this query to select all tags assigned to this article at the same time?"

SELECT tag FROM tags INNER JOIN tagstoarticles ON tags.id = tagstoarticles.tagid WHERE articleid=[your article's id]

"And how to do this when I just want to get the results without searching by tags?"

SELECT articles.id, tags.tag FROM articles INNER JOIN tagstoarticles ON tagstoarticles.articleid = articles.id INNER JOIN tags ON tagstoarticles.tagid = tags.id ORDER BY articles.id, articles.date

This gives you a distinct result row for each tag, so you'll have to apply a bit of postprocessing to convert this into a list of articles with tags. However by sorting by article id, you can be sure that all the tags for one article are returned together.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文