2015-03-31 4 views
1

У меня есть три таблицы в SQL Сервер-Алгоритм поиска для уникального результата с несколькими тегами

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 только один раз. Есть идеи?

ответ

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') 
      ) 
+0

С правильными индексами, это, вероятно, самым быстрым решением. –

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') 
) 
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') 
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' 
Смежные вопросы