Вопрос SQL - как выбрать все кортежи, которые содержат все ссылки во второй таблице? - PullRequest
0 голосов
/ 12 апреля 2011

Вот сделка - у меня здесь три стола:

Companies:
ID | NAME | DETAILS

TAGS
ID | TAGNAME

TAGS_COMPANIES
COMPANY_ID | TAGID

Используя вложенный запрос, я могу извлечь все компании, которые помечены тегами в определенном наборе, т.е.:

select c.* from companies c where c.id in (select t.company_id where t.tagid in (12,43,67))

Приведенный выше запрос возвращает все компании, которые имеют теги с идентификатором 12, 43 или 67, но мне нужно получить все компании с тегами 12 И 43 И 67

Как бы я повторил мой запрос здесь? Я использую MySQL

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Не слишком эффективно, но работает:

select c.* 
from companies c 
where c.id in (select t.company_id from tags_companies t where t.tagid = 12)
and c.id in (select t.company_id from tags_companies t where t.tagid = 43)
and c.id in (select t.company_id from tags_companies t where t.tagid = 67)

Еще одна возможность использования предложения HAVING:

select c.id, c.name, c.details
from companies c join tags_companies t on c.id = t.company_id
where t.tagid in (12, 43, 67)
group by c.id, c.name, c.details
having count(distinct t.tagid) = 3
0 голосов
/ 12 апреля 2011

С одним подзапросом.

select c.* 
      from companies c  
      where (c.id, 3) in 
         (select t.company_id, count(distinct t.tagid) 
                 from tags t
           where t.tagid in (12,43,67) 
             group by t.company_id)

магическое число 3 означает количество разных тегов.

...