2009-12-12 2 views
0

두 개의 테이블이 있습니다. 하나는 사용자 수입을 저장하고 다른 하나는 사용자 지불을 저장합니다. 제가하고자하는 것은 $ 50 최소 및 최종 지불에서만 지불 할 금액을받는 것입니다.지급 기한 내 하위 쿼리

표 (userEarnings는) 다음과 같은 열을

id ->autoincrement 
userid -> unique id for users 
earn ->the amount of money the user earn (25.00, 14.50..) 
date_added -> DATETIME column 

두 번째 테이블 (userPayment) 저장 사용자가 두 테이블에서

pid->autoincrement 
uid ->unique user id, this is the same as userid from the above table 
paid_amt->payments the user received(500.00, 100.00...) 
paid_date ->the date the user was paid(DATETIME) 

을 지불됩니다 때마다이있다, 나는 목록을 싶습니다 합계가 $ 50보다 큰 경우 마지막 지불 이후에 지불해야하는 금액의 합계입니다. 하위 쿼리와 그룹을 사용해야하지만 시작할 위치가 확실하지 않다고 가정합니다.

도움을 주시면 감사하겠습니다. 감사합니다

답변

0

약간 다른 접근 방식을하는 not exists 하위 쿼리를 사용하여. 맛에 따라 다르게 수행 할 수 있고 읽기가 쉬울 수도 있습니다.

SELECT ue.userid User 
,   SUM(ue.earn) AmountDue 
FROM  userEarnings ue 
WHERE  NOT EXISTS (
      SELECT * 
      FROM userPayment up 
      WHERE up.uid = ue.userid 
      AND up.paid_date >= ue.date_added 
     ) 
GROUP BY ue.userid 
HAVING AmountDue > 50.0 
1

이 시도 :

SELECT userEarnings.userid, SUM(earn) AS total_earn FROM (
    SELECT uid, MAX(paid_date) AS paid_date 
    FROM userPayment 
    GROUP BY uid) AS T1 
RIGHT JOIN userEarnings ON T1.uid = userEarnings.userid 
WHERE date_added > T1.paid_date OR T1.paid_date IS NULL 
GROUP BY userEarnings.userid 
HAVING total_earn > 50 
+0

'HAVING SUM (earn)> 50'이 아니어야합니까? –

+0

SergeyKazachenko가 맞고, '내부 조인'은 전에 지불되지 않은 사용자를 걸러냅니다. – Andomar

+0

외부 조인에 대한 조인을 수정했습니다. 그리고 SUM (적립) 또는 별칭을 사용하는지 여부는 중요하지 않다고 생각합니다. 둘 다 작동합니다. –

1
SELECT userEarnings.userid, SUM(userEarnings.earn) AS earn 
FROM userEarnings 
LEFT OUTER JOIN (
    SELECT uid, MAX(paid_date) AS last_payment 
    FROM userPayment 
    GROUP BY uid) AS q 
ON q.uid = userEarnings.userid 
--the q.last_payment IS NULL clause ensures that the user who never got a payment before will get his first $50 check 
WHERE (userEarnings.date_added > q.last_payment) OR (q.last_payment IS NULL) 
GROUP BY userEarnings.userid 
HAVING SUM(userEarnings.earn) >= 50.0 
+0

+1 이것이 효과가 있다고 생각합니다. – Andomar