Mysql 如何选择订购了3种不同产品但没有订购第四种产品的客户?

Mysql 如何选择订购了3种不同产品但没有订购第四种产品的客户?,mysql,prestashop,Mysql,Prestashop,我有一个SQL查询,可以让我知道客户何时订购了某种产品: 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 我不能简单地在1、2、3和od.product\U id中确定od.

我有一个SQL查询,可以让我知道客户何时订购了某种产品:

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

我不能简单地在1、2、3和od.product\U id中确定od.product\U id!=4,但我一直在研究如何正确构建该查询

有关信息,数据库结构是基本的Prestashop 1.6.1.4数据存储

下面是SQLFiddle:

我无法添加数据,这对SQLFiddle来说太多了


感谢您的帮助:

您可以在id\u客户上使用一些dinaminc表格联接

  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

您可以在id_客户上使用两个dinaminc表连接

  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

也许你应该换一种想法

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) )

也许你应该换一种想法

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) )


看,这个离我需要的很近。唯一奇怪的是,当我将第一个查询从4更改为另一个购买的产品(比如5)时,查询返回客户id,即使他购买了产品1、2、3、5。在这种情况下,结果不应包含该客户。@cyrin。第一个dinamic查询基于您的问题。你说一个也没有。。如果您需要排除的产品不止一个,您应该在第二个dinamic查询中添加一个条件,条件是排除的不同产品的数量..并搜索用户。。答案更新..很抱歉我不够清楚。我只想排除一种产品。客户尚未购买产品ID 4,但已购买产品ID 5。如果在您的第一次查询中,我将WHERE od.product_id 4更改为WHERE od.product_id 5,则该客户将被返回,并且不应该返回,因为该客户已购买了产品id 5。我清楚了吗?这很奇怪因为。。firts应该只返回尚未购买产品的客户和内部连接。两个dinamic查询之间的连接为on。。客户身份证。。因此,如果不在第一个可以与第二个连接。。我已经更新了asnwer,因为有一些错误和一个错误的NOTYes,很抱歉,我无法将数据粘贴到SQLFiddle,我达到了极限:/这个接近我需要的。唯一奇怪的是,当我将第一个查询从4更改为另一个购买的产品(比如5)时,查询返回客户id,即使他购买了产品1、2、3、5。在这种情况下,结果不应包含该客户。@cyrin。第一个dinamic查询基于您的问题。你说一个也没有。。如果您需要排除的产品不止一个,您应该在第二个dinamic查询中添加一个条件,条件是排除的不同产品的数量..并搜索用户。。答案更新..很抱歉我不够清楚。我只想排除一种产品。客户尚未购买产品ID 4,但已购买产品ID 5。如果在您的第一次查询中,我将WHERE od.product_id 4更改为WHERE od.product_id 5,则该客户将被返回,并且不应该返回,因为该客户已购买了产品id 5。我清楚了吗?这很奇怪因为。。firts应该只返回尚未购买产品的客户和内部连接。两个dinamic查询之间的连接为on。。客户身份证。。因此,如果不在第一个可以与第二个连接。。我更新了asnwer,因为有一些错误和一个错误NOTYes,很抱歉,我无法将数据粘贴到SQLFiddle,我达到了极限:/i对-1很好奇,我刚刚尝试了它,它似乎工作正常?现在我也很好奇。为什么-1。有人能解释吗?我已经对它进行了广泛的测试,我发现IN 1、2、3作为or子句工作:有些结果只有乘积_id 1、2或3,我需要它们都是1、2和3。你有什么想法吗?你可以使用od.product_id=1和od.product_id=2和od.product_id=3,但它不起作用,因为某个时候产品只有一个id。你有解决方案吗?我对-1很好奇,我刚刚尝试过,它似乎工作正常?现在我也很好奇。为什么-1。有人能解释吗?我已经对它进行了广泛的测试,我发现IN 1、2、3作为or子句工作:有些结果只有乘积_id 1、2或3,我需要它们都是1、2和3。您有什么想法吗?您可以使用od.product_id=1、od.product_id=2和od.product_id=3,但它不起作用,因为一次产品只有一个id您有解决方案吗?