2009-11-04 6 views
2

PROD1과 PROD2를 모두 구매 한 고객을 찾을 수있는 쿼리를 만드는 데 어려움이 있습니다. 나는 별개의 수를 얻으려고 그래서 기본적으로 (분명이 작동하지 않을 것이다)MySQL 두 개의 특정 제품을 주문한 고객을 검색합니다.

SELECT COUNT(DISTINCT userid) 
    FROM TRANSACTIONS 
WHERE product_id = 'prod1' 
    AND product_id = 'prod2' 

을 : 여기

종류의 내가하고 싶은 것처럼 보이는 의사 쿼리 product_id가 ' prod1'이고 값이 ' prod2'인 transactions 테이블에 거래가있는 사용자 ID입니다. 각 트랜잭션은 transactions 테이블의 행에 저장됩니다.

답변

4

나는 다음과 같은 방법으로 이러한 유형의 쿼리 수행 @najmeddine에 의해 shown 또한 당신이 원하는 답을 생산

SELECT COUNT(DISTINCT t1.userid) AS user_count 
    FROM TRANSACTIONS t1 
    JOIN TRANSACTIONS t2 USING (userid) 
WHERE t1.product_id = 'prod1' 
    AND t2.product_id = 'prod2'; 

GROUP BY 솔루션을하지만, MySQL을뿐만 아니라 수행하지 않습니다. MySQL은 GROUP BY 개의 쿼리를 최적화하는데 어려움을 겪고 있습니다.

최적화를 EXPLAIN으로 분석하고 두 가지 쿼리를 시도하고 몇 가지 테스트를 실행하고 데이터베이스에서 데이터 양이 지정된 경우 결과를 시간 측정해야합니다. sakila의 DB에 대한

+0

꽤 괜찮 법안 – Ian

4
SELECT userid 
    FROM TRANSACTIONS 
WHERE product_id in ('prod1', 'prod2') 
GROUP BY userid 
HAVING COUNT(DISTINCT product_id) = 2 
2

(사용자가 제공 한 추가 정보를 사용하여 아래에 추가 된 새로운 옵션)

SELECT * FROM Customers WHERE 
EXISTS (SELECT * FROM Purchases WHERE ProductID = 'PROD1' AND CustID = Customers.CustID) 
AND 
EXISTS (SELECT * FROM Purchases WHERE ProductID = 'PROD2' AND CustID = Customers.CustID) 

또는

SELECT * FROM Customers WHERE 
CustID IN (SELECT CustID FROM Purchases WHERE ProductID = 'PROD1') 
AND 
CustID IN (SELECT CustID FROM Purchases WHERE ProductID = 'PROD2') 

또는

SELECT UserID FROM Transactions WHERE ProductID = 'PROD1' 
AND EXISTS (SELECT * FROM Transactions WHERE UserID = T1.UserID 
    AND ProductID = 'PROD2') 
시도

또는

SELECT UserID FROM Transactions WHERE ProductID = 'PROD1' 
AND UserID IN (SELECT UserID FROM Transactions WHERE ProductID = 'PROD2') 
0

이 악명 높은 Northwind 샘플 DB를 기반으로 액세스 답변입니다. 당신은 아주 쉽게 mySql에서 그것을 번역 할 수 있어야합니다.

SELECT o.CustomerID, Sum([ProductID]='Prod1') AS Expr1, Sum([productid]='Prod1') AS Expr2 
FROM Orders AS o INNER JOIN [Order Details] AS d ON o.OrderID = d.OrderID 
GROUP BY o.CustomerID 
HAVING (((Sum([ProductID]='Prod1'))<>0) AND ((Sum([productid]='Prod1'))<>0)); 
0
SELECT COUNT(DISTINCT userId) 
FROM(
    SELECT userId 
    FROM transactions 
    WHERE product = 'PROD1' 
    INTERSECT 
    SELECT userId 
    FROM transactions 
    WHERE product = 'PROD2'); 

쿼리는 두 개의 중간 테이블, PROD2를 구입하는 사람들을 위해 PROD1 다른 동일한 테이블을 구입 한 고객의 사용자 ID 포함 하나를 만듭니다. 교차 연산자는 앞의 두 테이블 모두에서 찾은 행, 즉 두 제품을 모두 구입 한 행만 포함하는 테이블을 반환합니다.

0

예 :

SELECT R.customer_id, GROUP_CONCAT(I.film_id) 
FROM sakila.rental R 
RIGHT OUTER JOIN sakila.inventory I ON R.inventory_id = I.inventory_id 
WHERE I.film_id IN (22,44) GROUP BY R.customer_id HAVING COUNT(*) = 2 
관련 문제