简体   繁体   中英

How to get sum of two alias tables result in main result in mysql?

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).

QUERY

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM