MySQL 标签系统 (Toxi)
MySQL Tag System (Toxi)
我有一个由 3 个表组成的标签系统:
POSTS - Fields: ID, TITLE
TAGMAP - Fields: POSTID,TAGID
TAGS - Fields: ID,NAME
目前,我使用此查询获取每个标签的 post 数量:
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
这给了我一个标签列表,每个标签有 post 个计数:
ID NAME COUNT
----------------------
1 banana 8
2 apple 4
3 pudding 7
4 lemon 3
现在,我有一个搜索引擎,允许您单击一个标签,并获取与该标签相关的 post。如果我按示例单击 "apple",我会得到匹配的 post。但是其中一些 post 也有 "banana" 和 "pudding" 标签。我需要知道每个的计数,以生成具有更新的 post 计数的新菜单。
所以如果我点击苹果,会有 4 posts。在这4个post中,2个有"pudding"标签,3个有"lemon"标签。我需要这样的输出:
ID NAME COUNT
----------------------
1 banana 0
2 apple 4
3 pudding 2
4 lemon 3
如果我们继续这样,如果我单击 "lemon"(所以我们现在正在加载与 "apple" 和 "lemon" 相关的 post),并且有 1 个具有 "lemon" 标签的 post 也具有 "pudding" 标签,我需要这样的输出:
ID NAME COUNT
----------------------
1 banana 0
2 apple 4
3 pudding 1
4 lemon 3
我不确定它是否足够清楚 - 如果您需要更多信息,请告诉我。
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(*) 行以匹配。
我有一个由 3 个表组成的标签系统:
POSTS - Fields: ID, TITLE
TAGMAP - Fields: POSTID,TAGID
TAGS - Fields: ID,NAME
目前,我使用此查询获取每个标签的 post 数量:
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
这给了我一个标签列表,每个标签有 post 个计数:
ID NAME COUNT
----------------------
1 banana 8
2 apple 4
3 pudding 7
4 lemon 3
现在,我有一个搜索引擎,允许您单击一个标签,并获取与该标签相关的 post。如果我按示例单击 "apple",我会得到匹配的 post。但是其中一些 post 也有 "banana" 和 "pudding" 标签。我需要知道每个的计数,以生成具有更新的 post 计数的新菜单。
所以如果我点击苹果,会有 4 posts。在这4个post中,2个有"pudding"标签,3个有"lemon"标签。我需要这样的输出:
ID NAME COUNT
----------------------
1 banana 0
2 apple 4
3 pudding 2
4 lemon 3
如果我们继续这样,如果我单击 "lemon"(所以我们现在正在加载与 "apple" 和 "lemon" 相关的 post),并且有 1 个具有 "lemon" 标签的 post 也具有 "pudding" 标签,我需要这样的输出:
ID NAME COUNT
----------------------
1 banana 0
2 apple 4
3 pudding 1
4 lemon 3
我不确定它是否足够清楚 - 如果您需要更多信息,请告诉我。
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(*) 行以匹配。