Запрос, чтобы получить все компании, которые имеют продукты со всеми указанными атрибутами - PullRequest
0 голосов
/ 08 апреля 2020

Допустим, у меня есть две таблицы (от 1 до многих): таблица компании с идентификатором fk и таблица продукта с идентификатором fk, а также поля sId и tId (если sId содержит данные, tId равно нулю и наоборот, не уверен, если это имеет значение) .

Я хочу, чтобы каждая компания, у которой есть продукты, например, sId = 1, sId = 2, tId = 3 и tId = 4.

Таким образом, чтобы компания имела право, она должна иметь продукты с sId = 1 и sId = 2 и tId = 3 и tId = 4. Если кто-то отсутствует, он не должен появиться.

Я попытался присоединиться к таблицам и сделать

where pro.sId in ('1', '2') 
and pro.tId in ('3','4')

Но это не дает мне никаких компаний. Любая помощь будет оценена.

Ответы [ 2 ]

4 голосов
/ 08 апреля 2020

Вы можете использовать агрегацию. Предполагая, что в таблице products нет дубликатов sld или tld на company_id:

select c.id
from companies c
inner join products p on p.company_id = c.id
where p.sld in (1, 2) or p.tld in (3, 4)
group by c.id
having count(*) = 4

Если есть дубликаты, вы можете изменить предложение, имеющее:

having count(distinct p.sld) = 2 and count(distinct p.tld) = 2
3 голосов
/ 08 апреля 2020

Есть много способов достичь этого. Один из них:

select * from company where id in
(
  select company_id from product where sid = 1
  intersect
  select company_id from product where sid = 2
  intersect
  select company_id from product where tid = 3
  intersect
  select company_id from product where tid = 4
);

Другой:

select * from company
where id in (select company_id from product where sid = 1)
  and id in (select company_id from product where sid = 2)
  and id in (select company_id from product where tid = 3)
  and id in (select company_id from product where tid = 4);
...