具有多个标签的唯一结果的搜索算法
Search algorithm for unique result with multiple tags
我在 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 来了两次的查询结果。
但我只想拥有一次Eagle。有什么想法吗?
对于 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')
)
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')
我能想到的最快的解决办法,你只需要指定照片的名字然后做一个不同的,然后每个动物的名字都会根据标签出现一次。
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'
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')
)
我在 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 来了两次的查询结果。
但我只想拥有一次Eagle。有什么想法吗?
对于 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')
)
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')
我能想到的最快的解决办法,你只需要指定照片的名字然后做一个不同的,然后每个动物的名字都会根据标签出现一次。
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'
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')
)