让我们看一个简单的表格,如果客户购买了某种产品,则该表格将客户 ID 链接到产品 ID。我正在寻找列出购买特定产品的所有客户的 SQL (MySQL)。
客户 ID 产品 ID 1 A // 客户 1 购买了产品 A 2个 1乙 3个 2℃ 3乙
我想获取同时购买了A 和 B 的客户(客户 1 和 3)以及购买了 A 但不购买 B 的客户(客户 2)的列表。我需要为超过 2 种产品执行此操作,最多 10 种,例如“A 和 C 和 D,但不是 B 和 E 和 F”。
提问:get a list of customers who bought both A and B
SELECT CustomerID
FROM CustomerList
WHERE ProductID IN ('A', 'B')
GROUP BY CustomerID
HAVING COUNT(*) = 2
如果没有对ProductID
每个强制执行唯一性CustomerID
,DISTINCT
则需要关键字,
SELECT CustomerID
FROM CustomerList
WHERE ProductID IN ('A', 'B')
GROUP BY CustomerID
HAVING COUNT(DISTINCT ProductID ) = 2
对于第二个问题,“..A and C and D but not B and E and F”
SELECT CustomerID
FROM CustomerList
WHERE ProductID IN ('A', 'C', 'D')
GROUP BY CustomerID
HAVING COUNT(*) = 3 AND
CustomerID NOT IN
(
SELECT CustomerID
FROM CustomerList
WHERE ProductID IN ('B','E','F')
)
试试这个::
Select DISTINCT CUSTOMERID from table1 where PRODUCTID='A'
JW 的回答很完美,我只想补充一点。我在问题中使用了一个简化示例,在原始情况下,过滤发生在几个连接表上。以这个简单的例子为例,它基本上意味着 ProductID 可以为 NULL。查询有效,但运行 2 分钟。似乎原因是MySQL 查询优化错误。将子查询条件更改为
WHERE ProductID IS NOT NULL and ProductID IN('B','E','F')
将查询时间减少到两秒。