1

顧客が特定の製品を購入した場合に、顧客 ID を製品 ID にリンクする簡単なテーブルを見てみましょう。特定の製品を購入したすべての顧客をリストする SQL (MySQL) を探しています。

顧客 ID 製品 ID
    1 A // 顧客 1 が製品 A を購入
    2A
    1B
    3A
    2C
    3B

A と B の両方を購入した顧客 (顧客 1 と 3) と、A を購入したが B を購入しなかった顧客 (顧客 2)のリストを取得したいと考えています。「AとCとDで、BとEとFではない」のように、最大​​10個までの2つ以上の製品に対してこれを行う必要があります。

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

2 番目の質問については、「..A と C と D ですが、B と E と 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')

クエリ時間が 2 秒に短縮されました。

于 2013-02-14T11:52:33.177 に答える