2015-04-12 3 views
0

Учитывая таблицу с продаж, как это:Проверить несколько значений в операторе отбора

| PRODUCT_ID | USER_ID | 
|------------|---------| 
|   1 |  1 | 
|   2 |  1 | 
|   3 |  1 | 
|   3 |  2 | 
|   4 |  2 | 
|   1 |  3 | 
|   3 |  3 | 

И таблица с продуктами и производителями, как это:

| PRODUCT_ID | MANUFACTURER_ID | 
|------------|-----------------| 
|   1 |    1 | 
|   2 |    1 | 
|   3 |    2 | 
|   4 |    2 | 

Как я могу найти пользователей, которые имеют купил все продукты от производителя? Я знаю, что могу использовать

SELECT * 
FROM product 
WHERE MANUFACTURER_ID = x 

найти какие продукты принадлежат производителя х, но я не имею ни малейшего представления о том, как продолжить оттуда.

ответ

1

Я хотел бы написать запрос следующим образом:

select s.user_id 
from sales s join 
    products p 
    on s.product_id = p.product_id 
where p.manufacturer_id = x 
group by s.user_id 
having count(distinct s.product_id) = (select count(*) 
             from products 
             where manufacturer_id = x 
            ); 
1

Это выбирает всех пользователей, у которых продукт у определенного производителя, которого они не купили, не существует, поэтому они купили весь продукт этого производителя.

select t1.user_id from (
    select user_id from sales s 
    join manufacturers m on s.product_id = m.product_id 
    where manufacturer_id = x 
    group by user_id 
) t1 where not exists (
    select 1 from manufacturers m 
    left join sales s on s.product_id = m.product_id and s.user_id = t1.user_id 
    where m.manufacturer_id = t1.manufacturer_id  
    and s.product_id is null  
) 

Редактировать

Другой способ заключается в выборе всех пользователей, которые приобрели все продукты

select t1.user_id from (
    select s.user_id, count(*) cnt from product p 
    join sales s on s.product_id = p.product_id 
    where p.manufacturer_id = x 
    group by s.user_id 
) t1 join (
    select count(*) cnt from product 
    where manufacturer_id = x 
) t2 on t2.cnt = t1.cnt 
Смежные вопросы