搜索具有多个标签的唯一结果的算法

时间:2015-03-31 10:02:54

标签: c# sql search

我在sql server中有三个表 -

Photos table:

----------------------
| PhotoId | PhotoName|
----------------------
|         |          |
----------------------

Tags table:

----------------------
| TagId   |   TagName|
----------------------
|         |          |
----------------------

Junction table:

----------------------
| PhotoId |   TagId  |
----------------------
|         |          |
----------------------

照片可以包含多个标签,标签可以属于多张照片。

现在,例如Eagle标记为Bird, Animal, Wild。我想搜索标签Domestic, Bird, Animal。我正在使用sql语句where TagName='Domestic' OR TagName='Bird' OR TagName='Animal'。问题是,它产生查询结果,其中Eagle来了两次。

但我想只让鹰一次。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

select distinct p.*
from photos p
inner join Junction j on j.PhotoId = p.PhotoId
inner join tags t on j.TagId = t.TagId
where t.TagName in ('Domestic', 'Bird','Animal')

答案 1 :(得分:2)

我能想到的最快的解决方案,你只需要指定照片的名称然后做一个不同的,然后动物的每个名字将根据标签出现一次。

SELECT DISTINCT PhotoName
FROM Tags T
JOIN Junction J ON J.TagId = T.TagId
JOIN Photos P ON P.PhotoId = J.PhotoId
WHERE TagName=('Domestic' OR TagName='Bird') OR TagName='Animal'

答案 2 :(得分:2)

SELECT p.*
FROM photos p
WHERE EXISTS ( SELECT 'a'
               FROM junction j
               JOIN tags t ON t.TagId = j.TagId
               WHERE p.PhotoId = j.PhotoId
               AND t.TagName IN ('Domestic', 'Bird', 'Animal')
              )

答案 3 :(得分:1)

使用DISTINCT每张照片在结果集中只出现一次

select * from Photos
where PhotoId in
(   select DISTINCT PhotoId
    from Junction
    where TagId in
    (select TagId from Tags where TagName='Domestic' OR TagName='Bird' OR TagName='Animal')
)