2016-07-25 2 views
0

그래서 나는 points_log 테이블 하나와 leaderboard 테이블 하나를 가지고 있습니다.mysql은 새 쿼리에서 쿼리 결과를 사용합니다.

mysql> describe points_log; 
+---------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+---------+---------+------+-----+---------+-------+ 
| user_id | int(11) | NO |  | NULL |  | 
| points | int(11) | YES |  | 0  |  | 
| date | date | NO |  | NULL |  | 
+---------+---------+------+-----+---------+-------+ 
3 rows in set (0.00 sec) 

mysql> describe leaderboard; 
+-----------+--------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+-----------+--------------+------+-----+---------+-------+ 
| bucket | varchar(255) | YES |  | NULL |  | 
| user_id | int(11)  | YES |  | NULL |  | 
| school_id | int(11)  | YES |  | NULL |  | 
+-----------+--------------+------+-----+---------+-------+ 
3 rows in set (0.00 sec) 

나는 다음과 같은 쿼리가 있습니다.

SELECT leaderboard.user_id FROM leaderboard where 
leaderboard.bucket=(SELECT bucket FROM leaderboard WHERE leaderboard.user_id=$user_id) AND 
leaderboard.school_id = (SELECT school_id FROM leaderboard WHERE leaderboard.user_id=$user_id) 

이 전달 $ USER_ID와 양동이에 USER_ID 년대에 하나 개 이상의 행을 반환됩니다 내가하고 싶은 것은 그 모두를 가지고있다 그것이 내가 합계 (점) 원하는 무엇이든 0 I 될을 반환하지 않는 경우에, 그래서 뭔가를 반환 보장하지 않을 경우 USER_ID의 다음과 같은 쿼리를

SELECT sum(points) FROM points_log WHERE user_id=$user_id AND 
date >= (SELECT subdate(curdate(), INTERVAL (weekday(now())) DAY)) 

문제를 실행 찾으 두 번째 쿼리입니다 또한 각 행에 대해 user_id, 버킷 및 합 (포인트)을 반환해야합니다.

는 지금 내가 가지고있는이 가진 문제는 해당 사용자에 대한 points_log에 값이있는 경우에만 작동한다는 것입니다

SELECT leaderboard.user_id,sum(points_log.points) AS points, leaderboard.bucket 
     FROM points_log LEFT JOIN leaderboard ON points_log.user_id = leaderboard.user_id 
     WHERE points_log.DATE >= (SELECT subdate(curdate(), INTERVAL (weekday(now())) DAY)) 
     AND leaderboard.bucket=(SELECT bucket FROM leaderboard WHERE leaderboard.user_id=$user_id) 
     AND leaderboard.school_id = (SELECT school_id FROM leaderboard WHERE leaderboard.user_id=$user_id) 
     GROUP BY USER_ID ORDER BY SUM(points) DESC 

입니다. 값이 없으면 기본값을 0으로 만드는 방법을 모르겠습니다.

도움을 주시면 대단히 감사하겠습니다.

답변

1
SELECT leaderboard.user_id, COALESCE(sum(points_log.points), 0)AS points, leaderboard.bucket 
FROM points_log RIGTH OUTER JOIN leaderboard ON points_log.user_id = leaderboard.user_id 
WHERE points_log.DATE >= (SELECT subdate(curdate(), INTERVAL (weekday(now())) DAY)) 
AND leaderboard.bucket=(SELECT bucket FROM leaderboard WHERE leaderboard.user_id=$user_id) 
AND leaderboard.school_id = (SELECT school_id FROM leaderboard WHERE leaderboard.user_id=$user_id) 
GROUP BY USER_ID ORDER BY SUM(points) DESC 

이 시도 ... Outer JoinCOALESCE 기능을 확인합니다.

관련 문제