2016-07-25 17 views
0

So habe ich zwei Tabellen eine namens points_log und eine namens Leaderboard.Mysql Abfrageergebnis in neue Abfrage verwenden

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) 

Ich habe die folgende Abfrage:.

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) 

Dies wird wieder eine oder mehr Zeilen mit User_id den, die mit $ im Eimer sind User_id übergeben, was ich möchte, dass alle diejenigen zu tun, nehmen ist user_id des und findet die folgende Abfrage

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

das Problem ist, diese zweite Abfrage, wenn nicht zurück etwas garantiert, so dass in dem Fall, dass es nichts zurückliefert I Summe (Punkte) wollen 0 ich sein Außerdem müssen die user_id, bucket und sum (Punkte) für jede Zeile zurückgegeben werden.

Gerade jetzt, was ich habe, ist

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 

Das Problem dabei ist, dass es nur funktioniert, wenn ein Wert in points_log es für den Benutzer ist. Ich bin mir nicht sicher, wie man es auf 0 setzen kann, wenn es keinen Wert gibt.

Jede Hilfe wird sehr geschätzt!

Antwort

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 

Try this ... beachten Sie die Outer Join und die COALESCE Funktion.

Verwandte Themen