I need little help to simplify my mysql query. I have three tables. One for main user records, second for bonus points for each user (multiple records for each user) and third for result point (multiple record for each user).
SELECT u.*, (SELECT SUM(ub.Points)
FROM nba_user_bonus AS ub
WHERE ub.UserId = u.Id) AS BonusPoints,
(SELECT SUM(ur.Points)
FROM nba_user_result AS ur
WHERE ur.UserId = u.Id) AS ResultPoints
FROM nba_users AS u
WHERE u.Status = 'Enable'
ORDER BY u.Id ASC
Here I am getting each user with total bonus point and total result points, But I need TatalPoint (sum of result point and bonus points) for each user order by that TotalPoints DESC. In sort, I want list of users with points for leader board.
Please ask me if you will need any further detail for db tables. Hoping for your help.
Your query is reasonable. You can just add the two values together:
SELECT u.*,
((SELECT SUM(ub.Points) FROM nba_user_bonus ub WHERE ub.UserId = u.Id) +
(SELECT SUM(ur.Points) FROM nba_user_result ur WHERE ur.UserId = u.Id)
) as TotalPoints
FROM nba_users AS u
WHERE u.Status = 'Enable'
ORDER BY TotalPoints desc;
If you need all three values, you can use a subquery or repeat the calculations:
SELECT u.*, (BonusPoints + ResultPoints) as TotalPoints
FROM (SELECT u.*,
(SELECT SUM(ub.Points) FROM nba_user_bonus ub WHERE ub.UserId = u.Id) as BonusPoints,
(SELECT SUM(ur.Points) FROM nba_user_result ur WHERE ur.UserId = u.Id) as ResultPoints
FROM nba_users AS u
WHERE u.Status = 'Enable'
) u
ORDER BY TotalPoints desc;
You can also phrase this as joins with group bys. However, this method with subqueries in the select
may be faster than that approach.
EDIT:
To handle NULL
s in the first case, use ifnull()
or coalesce()
:
SELECT u.*,
(coalesce((SELECT SUM(ub.Points) FROM nba_user_bonus ub WHERE ub.UserId = u.Id), 0) +
coalesce((SELECT SUM(ur.Points) FROM nba_user_result ur WHERE ur.UserId = u.Id), 0)
) as TotalPoints
FROM nba_users AS u
WHERE u.Status = 'Enable'
ORDER BY TotalPoints desc;
Instead of subquerying in the SELECT portion of the statement, use a join. Then add a GROUP BY at the end so you get a distinct U.ID and UR and UB totals.
SELECT
u.ID,
SUM(ub.Points)+ SUM(ur.Points) as TotalPoints
FROM
nba_users AS u
LEFT OUTER JOIN nba_user_bonus as ub on
u.ID = ub.userid
LEFT OUTER JOIN nba_user_result as ur on
u.ID = ur.userid
WHERE u.STATUS = 'Enable'
GROUP BY 1
ORDER BY u.Id ASC
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.