简体   繁体   English

如何获取两个别名表的总和导致mysql的主要结果?

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

I need little help to simplify my mysql query. 我几乎不需要帮助来简化mysql查询。 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 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. 在这里,我为每个用户提供了总的奖励积分和总结果积分,但是我需要该TotalPoints DESC为每个用户订单提供TatalPoint(结果积分与奖励积分之和)。 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. 但是,这种带有select子查询的方法可能比该方法更快。

EDIT: 编辑:

To handle NULL s in the first case, use ifnull() or coalesce() : 要在第一种情况下处理NULL ,请使用ifnull()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. 而不是在语句的SELECT部分​​中进行子查询,请使用联接。 Then add a GROUP BY at the end so you get a distinct U.ID and UR and UB totals. 然后在末尾添加GROUP BY,这样您将获得不同的U.ID和UR和UB总数。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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