MySQL标签系统(有毒)

时间:2015-01-22 16:53:02

标签: mysql count

我有一个由3个表组成的标记系统:

POSTS  - Fields: ID, TITLE
TAGMAP - Fields: POSTID,TAGID
TAGS   - Fields: ID,NAME

目前,我使用此查询来获取每个代码的帖子数量:

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

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

ID    NAME       COUNT
----------------------
1     banana     8
2     apple      4
3     pudding    7
4     lemon      3

现在,我有一个搜索引擎,允许您点击标签,并获取与该标签相关的帖子。如果我点击" apple"例如,我得到匹配的帖子。但是这些帖子中的一些也有" banana"和"布丁"标签。我需要知道每个的计数,以生成一个新的菜单,其中包含更新的帖子数。

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

ID    NAME       COUNT
----------------------
1     banana     0
2     apple      4
3     pudding    2
4     lemon      3

如果我们继续这样做,如果我点击"柠檬" (所以我们现在正在加载与" apple" AND" lemon")相关的帖子,并且该帖子的第1个帖子中有" lemon"标签也有"布丁"标签,我需要一个像这样的输出:

ID    NAME       COUNT
----------------------
1     banana     0
2     apple      4
3     pudding    1
4     lemon      3

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

1 个答案:

答案 0 :(得分:0)

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;

调整标签名称列表和HAVING COUNT(*)行以匹配。