2016-02-24 5 views
0

В базе данных MySQL У меня есть следующие таблицы:MySQL сводной таблицы - НЕ

клиентов

CUSTOMER_ID | NAME 
--------------------------- 
1   | John Doe 
2   | Peter Jones 
3   | David Smith 

продукты

PRODUCT_ID | DESCRIPTION 
--------------------------- 
1   | Toothbrush 
2   | Shaving cream 
3   | Deodorant 

customer_product

CUSTOMER_ID | PRODUCT_ID 
--------------------------- 
1   | 2 
1   | 3 
2   | 1 
3   | 1 
3   | 2 

Таблица customer_product - сводная таблица. Когда клиент заказывает продукт, он будет зарегистрирован там.

Мой вопрос: как я могу выбрать всех клиентов, которые не заказали определенный продукт?

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

+0

Я думаю, что 'customer_product' правильно называется«отображение»таблицы, а не«стержень» Таблица. –

ответ

1

Вы можете использовать NOT EXISTS:

SELECT CUSTOMER_ID,NAME 
FROM customers AS c 
WHERE NOT EXISTS (
    SELECT 1 
    FROM customer_product AS cp 
    INNER JOIN products AS p 
     ON cp.PRODUCT_ID= p.PRODUCT_ID 
    WHERE p.DESCRIPTION = 'Toothbrush' AND cp.CUSTOMER_ID = c.CUSTOMER_ID) 
+0

Отлично работает. Благодаря! – elton73

+0

'cp':' INDEX (CUSTOMER_ID, PRODUCT_ID) ' –

1

Вот еще один способ, который будет работать для вас

select c.customer_id,c.Name from customers c 
where c.customer_id not in 
(select c.customer_id from customers c 
left join customer_product cp on c.customer_id = cp.customer_id 
inner join products p on cp.product_id = p.product_id 
where p.description ='toothbrush' 
) ; 
+0

Работает также. Спасибо – elton73

+0

@ elton73 ... ваш прием –

+0

'НЕ СУЩЕСТВУЕТ', скорее всего, будет быстрее, чем' NOT IN (SELECT ...) ' –

Смежные вопросы