1

让我们看一个简单的表格,如果客户购买了某种产品,则该表格将客户 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”。

4

3 回答 3

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每个强制执行唯一性CustomerIDDISTINCT则需要关键字,

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')
        )
于 2013-02-12T14:49:51.483 回答
1

试试这个::

Select DISTINCT CUSTOMERID from table1 where PRODUCTID='A'
于 2013-02-12T14:48:58.320 回答
0

JW 的回答很完美,我只想补充一点。我在问题中使用了一个简化示例,在原始情况下,过滤发生在几个连接表上。以这个简单的例子为例,它基本上意味着 ProductID 可以为 NULL。查询有效,但运行 2 分钟。似乎原因是MySQL 查询优化错误。将子查询条件更改为

  WHERE ProductID IS NOT NULL and ProductID IN('B','E','F')

将查询时间减少到两秒。

于 2013-02-14T11:52:33.177 回答