用于查找包含多个标记的资源的SQL查询

时间:2011-04-25 19:02:53

标签: mysql sql select

我有两张桌子。

Resource:
md5 (PK), link, title

Tags:
md5 (FK), category

它是一对多的关系,因此资源可以具有多个标签。 我希望能够提取具有两个标签的资源,例如包含标签“web”和“blog”的资源。如果我使用'OR',它显然会返回仅包含'web'或仅包含'blog'的文档,但如果我使用AND,即使我知道有资源包含两个标记,我也没有结果

SELECT DISTINCT tags.MD5, Resource.Title, Resource.Link, tags.Category
FROM Resource
INNER JOIN tags ON Resource.MD5 = tags.MD5
WHERE       
    (tags.Category = @tag)
OR
    (tags.Category = @tag2)
ORDER BY tags.MD5

3 个答案:

答案 0 :(得分:4)

你想这样做:

select t.MD5, r.Title, r.Link, t.Category
from Resource r inner join Tags t on r.MD5 = t.MD5
where exists (select category from Tags t1 where category = @tag and t1.MD5 = r.MD5)
and exists (select category from Tags t1 where category = @tag2 and t1.MD5 = r.MD5)

答案 1 :(得分:3)

以下内容将过滤掉不具备这两个标记的资源:

SELECT DISTINCT Resource.MD5, Resource.Title, Resource.Link, t1.Category, t2.Category 
FROM Resource 
INNER JOIN tags t1 ON Resource.MD5 = t1.MD5 AND t1.category = @tag
INNER JOIN tags t2 ON Resource.MD5 = t2.MD5 AND t2.category = @tag2

答案 2 :(得分:2)

select r.*
from resource as r
left join tags as t
on r.md5 = t.md5
where t.category in ('web','blog')
group by r.md5
having count(distinct(t.category)) = 2