2016-05-22 83 views
0

我有两个表,需要得到两列的总和(每个表中有一列)。两个表中两列的总和

  • 桌上游戏(id_tournament,id_game,电子邮件,点)PK(id_tournament,id_game,电子邮件)
  • 表中的结果(id_tournament,电子邮件,点)PK(id_tournament,电子邮件)
  • 表用户(id_user ,电子邮件,姓名)PK(id_user)

示例表结果:

1,[email protected],3 
1,[email protected],4 

示例表游戏:

1,1,[email protected],5 
1,2,[email protected],3 
1,3,[email protected],2 
1,1,[email protected],4 
1,3,[email protected],2 

示例表用户:

1,[email protected],John 
2,[email protected],Peter 

我的输出应该是:

John 13 
Peter 10 

我试图用

SELECT t3.name, SUM(t1.points+t2.points) as Total 
FROM user t3, games t1, results t2 
WHERE t1.email=t2.email AND t2.email=t3.email AND t1.id_tournament=t2.tournament 
GROUP BY t1.email 
ORDER BY Total DESC 

却得到了非常奇怪的数字。

+1

如果你想看到你的'奇异数'来自,只是删除组和总和。 (可以显示列,你可以为特定用户完成此操作,并自己进行数学计算。)您将看到您的联接导致问题;这可以通过斯宾塞的答案来解决。 –

回答

2

分别获得游戏桌上的总分数和结果表中的总分数,然后总计它们。

事情是这样的:

SELECT v.name 
     , SUM(v.points) AS points 
    FROM (
      SELECT gu.name 
       , SUM(g.points) AS points 
      FROM games g 
      JOIN user gu 
       ON gu.email = g.email 
      GROUP BY gu.name 

      UNION ALL 

      SELECT ru.name 
       , SUM(r.points) AS points 
      FROM results r 
      JOIN user ru 
       ON ru.email = r.email 
      GROUP BY ru.name 
     ) v 
    GROUP BY v.name 
    ORDER BY v.name 

编辑

新增失踪GROUP BY子句。

如果我们需要从用户表中返回名称的所有值时,即使在游戏或结果没有相关的行...

SELECT n.name 
     , IFNULL(SUM(v.points),0) AS points 
    FROM users n 
    LEFT 
    JOIN (
      SELECT gu.name 
       , SUM(g.points) AS points 
      FROM games g 
      JOIN user gu 
       ON gu.email = g.email 
      GROUP BY gu.name 

      UNION ALL 

      SELECT ru.name 
       , SUM(r.points) AS points 
      FROM results r 
      JOIN user ru 
       ON ru.email = r.email 
      GROUP BY ru.name 
     ) v 
     ON v.name = n.name 
    GROUP BY n.name 
    ORDER BY n.name 
+0

这将从两个表中的所有用户的总和点,我只有2个数字。我需要列出来自表用户的所有用户,然后根据用户的电子邮件从两个表中求和得分。 – otis

+0

@otis:我错过了GROUP BY子句。 (MySQL以外的数据库会引发错误。)应用更正。 – spencer7593

+0

先生,我非常感谢你! (从底部开始第3行只有一个错误,它应该是ON v.name = n.name) – otis