SQL:获取满足来自多个记录的条件的记录

时间:2013-02-12 14:48:05

标签: mysql sql

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

3 个答案:

答案 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

如果ProductIDCustomerID每个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')

将查询时间缩短为两秒。