gpt4 book ai didi

mysql - 订购 'X'和未订购 'Y'的客户(MySQL)

转载 作者:可可西里 更新时间:2023-11-01 07:56:11 24 4
gpt4 key购买 nike

假设有一个包含此表的数据库:

订单

OrderId  -  CustomerId
----------------------
100 - 1
101 - 2
102 - 1

订单详情

DetailId  -  OrderId -  ProductId
---------------------------------
1 - 100 - prod1
2 - 100 - prod2
3 - 101 - prod1
4 - 102 - prod3

我需要获取购买了产品“1”但从未购买过产品“2”的 CustomerId 列表。

根据提供的样本数据,我应该得到 CustomerId 2。

我写了这个SQL语句,但是真实的数据库真的很大,运行起来很慢...有没有办法改进我的句子?

SELECT DISTINCT(o.CustomerId) 
FROM orders o
JOIN order_details od ON od.orderId = o.orderId
WHERE od.productId = 'prod1'
AND o.customerId NOT IN
(SELECT DISTINCT(o.CustomerId) FROM order_details od2 WHERE
od2.productId = 'prod2');

谢谢!

最佳答案

不建议对大型值列表使用 IN 运算符。相反,您可以使用 EXISTS或向您的查询添加更多联接。

使用存在:

SELECT DISTINCT(o.CustomerId) 
FROM orders o
JOIN order_details od ON od.orderId = o.orderId
WHERE od.productId = 'prod1'
AND NOT EXISTS
(
SELECT 1
FROM orders o2
JOIN order_details od2 ON od2.orderId = o2.orderId
WHERE o2.customerId = o.customerId
AND od2.productId = 'prod2'
);

使用连接:

SELECT DISTINCT(o.CustomerId) 
FROM orders o
INNER JOIN order_details od ON od.orderId = o.orderId
LEFT JOIN order_details od2 ON od2.orderId = o.orderId AND od2.productId = 'prod1'
WHERE od.productId = 'prod1'
AND od2.DetailId IS NULL -- Assuming that the detailId column does not allow null values.

注意:代码是这里直接写的,没有测试,可能有一些错误。为了获得更好的答案,我建议始终在您的查询中包含示例数据的 DDL + DML,以便人们能够在发布答案之前检查答案。

关于mysql - 订购 'X'和未订购 'Y'的客户(MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30614350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com