2012-07-05 13 views
0

다음 SQL 쿼리가 있습니다.MYSQL SUM 및 substract

SELECT u.username, SUM(p.points) AS points, 
      SUM(sp.spPoints) AS spPoints, 
      (SUM(sp.spPoints) - SUM(p.points)) AS Puntos_Restantes 
FROM  users as u 
LEFT JOIN points as p ON (u.userid = p.userid) 
LEFT JOIN sppoints AS sp ON (u.userid = sp.userid) 
WHERE  u.userid = '1' 
GROUP BY u.userid 

나의 목표는 SUM 2 필드를 뺀 다음 빼기 위의 쿼리를 실행할 때 두 번째 SUM이 잘못되었습니다.
표는 다음과 같습니다 : 25 spPoints에서 : 포인트에서

points: pointId, userId, points  
sppoints: spPointId, userId, spPoints  

내가이 금액이 10 을하지만 난 쿼리를 실행할 때 얻을 :

points spPoints Puntos_Restantes 
25  30    5 

잘못 여기서 뭐하는거야 ?

+0

당신은 당신이에서 당기는하고있는 테이블을 보여줄 수 있습니까? 아니면 너무 큽니까? – Dancrumb

+0

은 어쩌면 당신은 합 ((p.points) (sp.spPoints))를 의미한다. – xQbert

+0

귀하의 예제를 재현하는 데 필요한 전체 데이터를 표시하십시오 - – lanzz

답변

2

users 모두 다른 2 개 테이블에 일대 다 관계가있다. 이로 인해 2 개의 조인은 points 열에있는 미니 카 스터 안 제품과 동일한 데이터가있는 여러 행을 생성합니다. 그런 다음 집계됩니다.

이 문제를 방지하기 위해 가입 그때까지 그룹에 하위 쿼리를 사용하고 있습니다 : 둘 이상의 사용자에 대한 결과를 원한다면 (또는 모든 사용자), 세 WHERE userid=1을 대체

SELECT 
     u.username 
    , COALESCE(p.pPoints,0) 
     AS pPoints 
    , COALESCE(sp.spPoints,0) 
     AS spPoints 
    , COALESCE(p.pPoints,0) - COALESCE(sp.spPoints,0) 
     AS Puntos_Restantes 
FROM 
     users as u 
    LEFT JOIN 
     (SELECT userid, SUM(points) AS pPoints 
     FROM points 
     WHERE userid = 1 
     GROUP BY userid 
    ) AS p 
    ON u.userid = p.userid 
    LEFT JOIN 
     (SELECT userid, SUM(spPoints) AS spPoints 
     FROM sppoints 
     WHERE userid = 1 
     GROUP BY userid 
    ) AS sp 
    ON u.userid = sp.userid 
WHERE u.userid = 1 ; 

을 조건 (또는 모두 제거). points(userid, points)sppoints(userid, spPoints)

지수는 효율적으로 도움이 될 것입니다.

+0

좋은 솔루션을 방지 할 수 있습니다. 하지만, 하위 쿼리에 왜'WHERE userid = 1'을 포함 시킬까요? 성능상의 이유로? 모든 테이블 집계를 피하려면? – danihp

+0

나는 이것을 알 수있다 : '필드 목록'에 알 수없는 열 'points' – user995691

+0

@danihp : 성능을 위해. 따라서 하위 쿼리는 특정 사용자에 대해서만 점수를 계산합니다. –