Mysql 选择两个表并对列值求和

Mysql 选择两个表并对列值求和,mysql,sql,sum,subquery,Mysql,Sql,Sum,Subquery,我需要对其中的4个表执行一次选择,并通过将表preds和exact中的奖励值相加来获得前5名分数: 我一直在想: SELECT ( select sum(preds.reward) FROM preds, matches, tbl_users WHERE ...some clauses... ) a, ( select sum(exact.reward) FROM exact, matches, tbl_users WHERE ...som

我需要对其中的4个表执行一次选择,并通过将表preds和exact中的奖励值相加来获得前5名分数:

我一直在想:

SELECT ( 
      select sum(preds.reward) FROM preds, matches, tbl_users WHERE ...some clauses...              
) a,
( 
      select sum(exact.reward) FROM exact, matches, tbl_users WHERE ...some clauses...     
) b, 
      ...here I need to sum(a+b) as total..., 
      tbl_users.userID
FROM
      tbl_users
GROUP BY userID 
ORDER BY total DESC LIMIT 5

如果您真的需要这些子查询而不是连接它们,那么您唯一的解决方案似乎是另一个子查询:

选择combined.a,combined.b,combined.a+combined.b作为sum,combined.userID 从…起 选择 从preds、matches、tbl_用户中选择sumpreds.raward,其中…一些子句。。。 A. 选择sumexact.reward FROM exact、matches、tbl_用户,其中…一些条款。。。 B tbl_users.userID userID 从…起 tbl_用户 按用户ID分组 按总描述限值5订购 合二为一
将内部查询返回的记录数量限制为5后,这不会对性能造成显著影响。

如果您确实需要这些子查询而不是将它们连接起来,那么您唯一的解决方案似乎是另一个子查询:

选择combined.a,combined.b,combined.a+combined.b作为sum,combined.userID 从…起 选择 从preds、matches、tbl_用户中选择sumpreds.raward,其中…一些子句。。。 A. 选择sumexact.reward FROM exact、matches、tbl_用户,其中…一些条款。。。 B tbl_users.userID userID 从…起 tbl_用户 按用户ID分组 按总描述限值5订购 合二为一
将内部查询返回的记录数量限制为5后,这不会对性能造成显著影响

我认为更典型的查询方法是:

SELECT u.uid,
       ((select sum(p.reward) 
         from preds p
         where p.uid = u.uid
        ) +
        (select sum(e.reward) 
         from exact e
         where e.uid = u.uid
        )
       ) total
from tbl_users u join
     matches m
     on . . .
where . . .
order by total desc
limit 5;
这限制了查询的复杂性。根据where子句的性质,使用相关子查询可以大大提高性能


注意:如果一个表或两个表中都缺少用户,则需要考虑子查询可能返回NULL。

我认为更典型的查询方法是:

SELECT u.uid,
       ((select sum(p.reward) 
         from preds p
         where p.uid = u.uid
        ) +
        (select sum(e.reward) 
         from exact e
         where e.uid = u.uid
        )
       ) total
from tbl_users u join
     matches m
     on . . .
where . . .
order by total desc
limit 5;
这限制了查询的复杂性。根据where子句的性质,使用相关子查询可以大大提高性能


注意:如果一个表或两个表中都缺少用户,则需要考虑子查询可能返回NULL。

实际上我不需要它们,我只需要求和。我该如何加入他们?这取决于你的桌子布局。但是,如果你只是在聚合,我的解决方案应该会起作用。实际上,我不需要它们,我只需要总和。我该如何加入他们?这取决于你的桌子布局。但是,如果您刚刚开始聚合,我的解决方案应该有效。您有问题吗?我建议你不要在FROM子句中使用逗号。你有什么问题吗?我建议你不要在FROM子句中使用逗号。我对你的代码做了一些调整,得到了我想要的结果。最后我还必须按用户ID分组。谢谢。我对你的代码做了一些调整,得到了我想要的结果。最后我还必须按用户ID分组。谢谢