繁体   English   中英

连接3个表,总计来自满足特定条件的两列

[英]joining 3 tables with sum total from two columns meeting a certain criteria

说我有3张桌子:

Players
+------+-------+
| id   | name  |
+------+-------+
| 1    | Ben   |
| 2    | Bill  |
| 3    | John  |
| 4    | Hugh  |
| 5    | Fred  |
+------|-------+
Game1              Game2
+------+-------+    +------+-------+
| p_id | points|    | p_id | points| 
+------+-------+    +------+-------+
| 1    | 800   |    | 1    | 300   |
| 1    | 400   |    | 5    | 800   |
| 2    | 100   |    | 2    | 900   |
| 3    | 1000  |    | 4    | 1200  |
+------|-------+    +------|-------+

我想总结两个表中的总点数,按p_ID分组,其中总和大于某个数量,例如1000。 所以我希望结果看起来像这样。

Query Result
+------+---------+---------+--------+
| p_id | points1 | points2 | total  |
+------+---------+---------+--------+
| 1    |  1200   |   300   |  1500  |
| 2    |  100    |   900   |  1000  |
| 3    |  1000   |    0    |  1000  |
| 4    |   0     |   1200  |  1200  |
+------|---------+---------+--------+

以下是我当前的查询,但我没有得到我需要的结果。

SELECT `players`.`p_id`, 
COALESCE(sum(`Game1`.`points`), 0) as 'Game1', 
COALESCE(sum(`Game2`.`points`), 0) as 'Game_2', 
COALESCE(sum(`Game1`.`points`), 0) + COALESCE(sum(`Game2`.`points`), 0) as 'total' 
from `players` 
left join `Game1` on `players`.`p_id`=`Game1`.`p_id` 
left join `Game2` on `players`.`p_id`=`Game2`.`p_id` 
having sum(`Game2`.`points`) + sum(`Game1`.`points`) >= 1000 
order by sum(`Game1`.`points`) + 
sum(`Game2`.`points`) desc

为了使其正常工作,您需要在连接之前进行聚合。 否则,您最终会遇到与每个游戏的笛卡尔积相关的问题。

因为MySQL不支持full outer join ,所以最好的方法是使用union all

select p_id, sum(points1) as points1, sum(points2) as points2
from ((select p_id, points as points1, 0 as points2
       from Game1
      ) union all
      (select p_id, 0, points
       from Game2
      )
     ) g
group by p_id;
SELECT
  players.id AS p_id,
  IFNULL(points1,0) AS Game1,
  IFNULL(points2,0) AS Game2,
  IFNULL(points1,0)+IFNULL(points2,0) AS total
FROM players
  LEFT JOIN (
    SELECT p_id, SUM(Game1.points) AS points1
    FROM Game1
    GROUP BY p_id
  ) AS GameSum1 ON players.id=GameSum1.p_id
  LEFT JOIN (
    SELECT p_id, SUM(Game2.points) AS points2
    FROM Game2
    GROUP BY p_id
  ) AS GameSum2 ON players.id=GameSum2.p_id
GROUP BY players.id
HAVING total>=1000
ORDER BY total DESC

编辑

修复了错误的IFNULL()范围,请参阅SQLfiddle

编辑2

根据@ GordonLinoff的输入修复

暂无
暂无

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

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