[英]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.