SQL-запрос для поиска ресурса, содержащего более одного тега - PullRequest
1 голос
/ 25 апреля 2011

У меня есть две таблицы.

Resource:
md5 (PK), link, title

Tags:
md5 (FK), category

это отношение один ко многим, так что у ресурса может быть несколько тегов. Я хочу иметь возможность извлечь ресурс, который имеет оба тега, например, ресурс, содержащий теги web и blog. Если я использую «ИЛИ», он, очевидно, вернет даже тот документ, который содержит только «сеть» или только «блог», но если я использую «И», я не получу результатов, хотя знаю, что есть ресурсы, содержащие оба тега

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 ]

4 голосов
/ 25 апреля 2011

Вы хотите сделать так:

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)
3 голосов
/ 25 апреля 2011

Следующие элементы будут отфильтровывать ресурсы, не обладающие обоими тегами:

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 голосов
/ 25 апреля 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...