繁体   English   中英

MYSQL:如何 Select 购买了一种产品但未购买另一种产品的客户

[英]MYSQL: How to Select Customers That Bought One Product But Not Another

我正在研究一个数据库,我想获取所有购买了名称包含 citroen 但没有名称包含 guzzi 的产品的客户的列表。

数据库的结构如下:

数据库

我尝试了以下方法:

SELECT customerName, productName
FROM customers c
INNER JOIN orders o
USING (customerNumber)
INNER JOIN orderdetails od
USING (orderNumber)
INNER JOIN products p
USING (productCode)
WHERE productName LIKE '%citroen%'
AND productName NOT IN (
SELECT productCode
FROM products
WHERE productName LIKE '%guzzi%'
);

但它也选择了购买 guzzi 的人。

有什么线索吗?

条件聚合计算每种类型的产品购买了多少...

SELECT
  o.customerNumber
FROM
  orders o
INNER JOIN
  orderdetails od
    USING (orderNumber)
INNER JOIN
  products p
    USING (productCode)
WHERE
     p.productName LIKE '%citroen%'
  OR p.productName LIKE '%guzzi%'
GROUP BY
  o.customerNumber
HAVING
      MAX(CASE WHEN p.productName LIKE '%citroen%' THEN 1 ELSE 0 END) = 1
  AND MAX(CASE WHEN p.productName LIKE '%guzzi%'   THEN 1 ELSE 0 END) = 0

更长,但如果每个客户(平均而言)大量相关购买,则可以更快......

SELECT
  *
FROM
  customer
WHERE
  EXISTS (
    SELECT
      o.customerNumber
    FROM
      orders o
    INNER JOIN
      orderdetails od
        USING (orderNumber)
    INNER JOIN
      products p
        USING (productCode)
    WHERE
          o.customerNumber  =   customer.CustomerNumber
      AND p.productName    LIKE '%citroen%'
  )
  AND NOT EXISTS (
    SELECT
      o.customerNumber
    FROM
      orders o
    INNER JOIN
      orderdetails od
        USING (orderNumber)
    INNER JOIN
      products p
        USING (productCode)
    WHERE
          o.customerNumber  =   customer.CustomerNumber
      AND p.productName    LIKE '%guzzi%'
  )

在您的最后一个条件中,您将 productName 与 productCode 进行比较,所以我想 NOT IN 将始终返回 TRUE。

SELECT customerName, productName
FROM customers c
    INNER JOIN orders o
        USING (customerNumber)
    INNER JOIN orderdetails od
        USING (orderNumber)
    INNER JOIN products p
        USING (productCode)
WHERE productName LIKE '%citroen%'
AND NOT EXISTS (
    SELECT 'x'
    FROM orders o2
        INNER JOIN orderdetails od2
            USING (orderNumber)
        INNER JOIN products p2
            USING (productCode)
    WHERE o2.customerNumber = c.customerNumber
    AND p2.productName LIKE '%guzzi%'
)
AND productName NOT LIKE '%guzzi%'
;```

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM