2014-11-26 5 views
0

나는 다음과 같은 쿼리 한 :멀티 집계 SQL 쿼리 기능

SELECT u.username, t.pack_id, COUNT(t.id) transaction_count 
FROM `transaction` t 
INNER JOIN `user` u ON t.customer_id = u.id 
GROUP BY (
t.customer_id 
) 
HAVING transaction_count >1 

와 나는 transaction_count> 1 하고 만든 첫 번째 트랜잭션을 가지고있는 모든 사용자의 사용자 이름과 거래를 얻기 위해 노력하고는의 수량입니다 3과 같은 목록을 얻고 싶습니다.

username: 
    transaction1 
    transaction2 

username2: 
    transaction3 
    transaction4 
    transaction5 

이 경우에도 가능합니까? 내 트랜잭션 테이블은 다음과 같습니다

enter image description here

을 여기에 내 사용자 테이블의 :

enter image description here

답변

0

당신은 MySQL의에서이 같은 결과를 얻을 수없는, 가장 가까운 하나가 아마도 :

user1 trans1 
user1 trans2 
user1 trans3 
user1 trans4 
user2 trans1 
user2 trans2 
user2 trans3 

그리고 그 중 하나를 수행하려면 간단하게 inner join처럼하십시오. 그러나, 당신이 원하는 두 가지 조건을 적용하기 위해서는 복잡한 조금 얻을

SELECT ux.*,tx.* FROM 
(
    SELECT u.*,count(t1.id) as transaction_count FROM users u 
    INNER JOIN transaction t1 ON t1.customer_id = u.id 
    INNER JOIN (
    SELECT s1.customer_id,MIN(s1.created) as min_date 
    FROM transaction s1 
    GROUP BY s1.customer_id 
) t2 ON t2.customer_id = u.id 
    INNER JOIN transaction t3 ON t3.customer_id = u.id AND t3.created = t2.min_date AND t3.quatity>3 
    GROUP BY u.id 
    HAVING count(t1.id)>3 
) ux 
INNER JOIN transaction tx ON tx.customer_id = ux.id 
ORDER BY ux.id,tx.id 
간단한 설명

: 하위 쿼리 (T2)에

거래 S1 사용자

트랜잭션 (T3) 당 첫 번째 트랜잭션의 날짜를 찾는 데 사용됩니다

트랜잭션 당 t1은 사용자 당 트랜잭션 수를 계산하는 데 사용됩니다 (그리고 이러한 조항을 3 개 이하로 필터링하는 데 사용됩니다)

부질 UX는 텍사스가 마지막으로 출력


편집을 사용자 당 거래를 추가하는 두 조건을

거래를 준수 사용자가 원하는 분야 내 실수, 당신이 transaction_count> 3 조건을 원한다고 생각을하지만 transaction_count> 1을 입력했는지 확인하십시오. 큰일이 아닐지라도, 쿼리는 단지 한 줄을 더 간단하게합니다. 조건은 INNER JOIN t3에 의해 처리됩니다 (INNER JOIN은 일치하는 트랜잭션이없는 사용자를 전달하지 않습니다). 따라서 transaction_count 열로 트랜잭션을 계산하기 위해 트랜잭션 t1을 사용합니다.

SELECT ux.*,tx.* FROM 
(
    SELECT u.*,count(t1.id) as transaction_count FROM users u 
    INNER JOIN transaction t1 ON t1.customer_id = u.id 
    INNER JOIN (
    SELECT s1.customer_id,MIN(s1.created) as min_date 
    FROM transaction s1 
    GROUP BY s1.customer_id 
) t2 ON t2.customer_id = u.id 
    INNER JOIN transaction t3 ON t3.customer_id = u.id AND t3.created = t2.min_date AND t3.quatity>3 
    GROUP BY u.id 
) ux 
INNER JOIN transaction tx ON tx.customer_id = ux.id 
ORDER BY ux.id,tx.id