首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL标签系统(Toxi)

MySQL标签系统(Toxi)
EN

Stack Overflow用户
提问于 2015-01-22 16:53:02
回答 1查看 218关注 0票数 0

我有一个标签系统,由三个表组成:

代码语言:javascript
复制
POSTS  - Fields: ID, TITLE
TAGMAP - Fields: POSTID,TAGID
TAGS   - Fields: ID,NAME

目前,我使用这个查询来获取每个标记的帖子数量:

代码语言:javascript
复制
SELECT t.id, t.name, (SELECT COUNT(*) AS count FROM tagmap WHERE tagmap.tagid=t.id) AS count FROM tags AS t ORDER BY t.name ASC

这给了我一个标签列表,每个标签的帖子数如下:

代码语言:javascript
复制
ID    NAME       COUNT
----------------------
1     banana     8
2     apple      4
3     pudding    7
4     lemon      3

现在,我有了一个搜索引擎,可以让你点击一个标签,并得到与这个标签相关的帖子。如果我点击“苹果”的例子,我得到匹配的帖子。但这些帖子中也有“香蕉”和“布丁”标签。我需要知道每一个的计数,以生成一个新的菜单与更新后的帖子计数。

因此,如果我点击苹果,将会有4个帖子。在这4篇文章中,2篇有“布丁”标签,3篇有“柠檬”标签。我需要这样的输出:

代码语言:javascript
复制
ID    NAME       COUNT
----------------------
1     banana     0
2     apple      4
3     pudding    2
4     lemon      3

如果我们继续这样做,如果我点击“柠檬”(所以我们现在正在加载与“苹果”和“柠檬”相关的帖子),并且有一个有“柠檬”标签的帖子也有“布丁”标签,我需要这样的输出:

代码语言:javascript
复制
ID    NAME       COUNT
----------------------
1     banana     0
2     apple      4
3     pudding    1
4     lemon      3

我不确定它是否足够清楚-如果你需要更多的信息,请告诉我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-22 17:56:38

代码语言:javascript
复制
SELECT 
    matchTags.id, matchTags.name, COUNT(matchTagMap.tagid) AS count
FROM 
    (SELECT postid 
    FROM 
        tags AS searchTags
        JOIN tagmap AS searchTagMap
            ON searchTags.id = searchTagMap.tagid
        WHERE searchTags.name IN ('apple', 'pudding')
        GROUP BY searchTagMap.postid
        HAVING COUNT(*) = 2
    ) dt

    CROSS JOIN tags AS matchTags
    LEFT JOIN tagmap AS matchTagMap
        ON dt.postid = matchTagMap.postid AND matchTagMap.tagid = matchTags.id
GROUP BY matchTags.id;

调整标记名列表和有计数(*)行以进行匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28094337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档