如果客户购买了某种产品,我们可以使用一个简单的表格将客户ID与产品ID相关联。我正在寻找一个SQL(MySQL),它列出了购买特定产品的所有客户。
CustomerID ProductID 1 A // customer 1 bought product A 2 A 1 B 3 A 2 C 3 B
我想获得购买 A和B(客户1和3)以及购买A而非B(客户2)的客户的客户列表。我需要为超过2种产品做这件事,大约10种,比如“A和C和D但不是B和E和F”。
答案 0 :(得分:5)
问题: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
个关键字,
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')
)
对于第二个问题,“.. A和C和D但不是B和E和F”
{{1}}
答案 1 :(得分:1)
试试这个::
Select DISTINCT CUSTOMERID from table1 where PRODUCTID='A'
答案 2 :(得分:0)
JW的答案非常有效,我只想补充一点。我在问题中使用了一个简化的例子,在最初的情况下,过滤发生在几个连接的表上。把它带到这个简单的例子,它基本上意味着ProductID可以是NULL。查询有效,但运行2分钟。似乎原因是MySQL query optimization bug。将子查询条件更改为
WHERE ProductID IS NOT NULL and ProductID IN('B','E','F')
将查询时间缩短为两秒。