2017-01-23 13 views
0

У меня есть этот SQL запрос, дайте мне знать, когда клиент заказал определенный продукт:Как выбрать клиентов, заказавших 3-х различных продуктов, но не четвертый?

SELECT * FROM ps_customer c 
INNER JOIN ps_orders o ON (c.id_customer=o.id_customer) 
INNER JOIN ps_order_detail od ON(od.id_order=o.id_order) 
WHERE od.product_id=1 

я хотел бы, чтобы получить клиентов, которые имеют порядок продукт 1, 2, 3, но никогда 4.

Я не могу просто сделать WHERE od.product_id IN (1, 2, 3) AND od.product_id != 4, но я зациклился на том, как правильно построить этот запрос.

Для информации структура базы данных является базовым хранилищем данных Prestashop (1.6.1.4).

Вот SQLFiddle: http://sqlfiddle.com/#!9/dfd65

(я не могу добавить данные, это слишком много для SQLFiddle ...)

Спасибо за вашу помощь :)

+0

См. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very- simple-sql-query – Strawberry

ответ

1

может быть, вы должны думать по-другому

SELECT * FROM ps_customer c 
INNER JOIN ps_orders o ON (c.id_customer=o.id_customer) 
INNER JOIN ps_order_detail od ON(od.id_order=o.id_order) 
WHERE od.product_id IN (1, 2, 3) and c.id_customer NOT IN (select id_customer from ps_orders where product_id IN (4)) 
+0

Мне любопытно, что -1, я просто попробовал и, похоже, работает правильно? –

+0

@CyrilN. спасибо за вашу поддержку –

+0

Теперь мне тоже любопытно. почему -1. любой может объяснить? –

1

вы могли бы использовать пара dinaminc стола присоединиться на id_customer

select * from ( 
     SELECT id_customer 
     FROM ps_customer c 
     INNER JOIN ps_orders o ON c.id_customer=o.id_customer 
     INNER JOIN ps_order_detail od ON od.id_order=o.id_order 
     WHERE od.product_id <> 4 ) t1 
    INNER JOIN (
    SELECT id_customer FROM ps_customer c 
    INNER JOIN ps_orders o ON c.id_customer=o.id_customer 
    INNER JOIN ps_order_detail od ON od.id_order=o.id_order 
    WHERE od.product_id in (1,2,3) 
    having count(distinct(od.product_id)) =3 
    ) t2 on t1.id_customer = t2.id_customer 
+0

Это близко к тому, что мне нужно. Единственное замечание состоит в том, что когда я меняю первый запрос с 4 на другой купленный product_id (скажем, 5), запрос возвращает client_id, хотя он купил продукт 1, 2, 3, 5. В этом случае результат не должен содержать этого клиента. –

+0

@CyrilN. , первый динамический запрос основан на вашем вопросе. вы sai не один prduct .. если вам нужно больше, чем исключенный продукт, вы должны сделать, как во втором динамическом запросе, добавив условие на то количество отдельных продуктов, исключенных .. и поиск <> пользователь .. ответ обновлен .. – scaisEdge

+0

I Мне жаль, что я не был достаточно ясен. Я действительно хочу исключить только один продукт. Идентификатор продукта 4 не был куплен клиентом, но идентификатор продукта 5 был. Если в вашем первом запросе я меняю 'WHERE od.product_id <> 4', на' WHERE od.product_id <> 5', клиент возвращается, и он не должен, так как этот клиент купил идентификатор продукта 5. Я понятнее? –