复杂mysqlselect
Complicated mysql select
我必须select来自以下table(它的简化版本)的一些数据:
game player v1 v2
1 p1 2 3
1 p1 1 2
1 p2 5 3
1 p3 6 7
1 p3 2 1
2 p4 4 6
2 p2 2 1
2 p3 3 4
3 p1 4 9
3 p3 5 3
...
n p3 3 4
n p2 4 9
n p3 5 3
当玩家 p1 参与游戏时(就像在游戏 1 和游戏 3 中发生的那样),我想 select 玩家 p1 的所有 v2 观察值的总和,按游戏计算。
当玩家 p1 不参加游戏时(如游戏 2 和游戏 n),我想 select 所有玩家的所有 v1 观察值的总和,按游戏计算。我想要所有游戏的所有玩家的信息,即使他们没有参加特定游戏。
这是我想要找到的最终结果:
game player v
1 p1 5 (v2: 3+2)
1 p2 3 (v2: 3)
1 p3 8 (v2: 7+1)
1 p4 16 (v1: 2+1+5+6+2)
2 p1 9 (v1: 4+2+3)
2 p2 1 (v2: 1)
2 p3 4 (v2: 4)
2 p4 6 (v2: 6)
3 p1 9 (v2: 9)
3 p2 9 (v1: 4+5)
3 p3 3 (v2: 3)
3 p4 9 (v1: 4+5)
...
n p1 12 (v1: 3+4+5)
n p2 9 (v2: 9)
n p3 3 (v2: 3)
n p4 12 (v1: 3+4+5)
非常感谢您的帮助。非常感谢。
由于 2 个摘要使用不同的分组依据条件,我只能考虑在游戏和玩家的笛卡尔积上留下的 2 个子查询中生成总和。
我假设你有一个球员主数据 table 以及列出所有球员。在下面的示例中,我将其称为 players
。我将您上面的 table 称为 games
。
select
t1.game,
p.player,
case
when t2.player is null then t3.sumv1
else t2.sumv2
end as v
from (select distinct game from games) t1
inner join players p --note the lack of join condition, I'm creating a Cartesian join
left join (select game, player, sum(v2) as sumv2 from games group by game, player) t2 on t1.game=t2.game and p.player=t2.player
left join (select game, sum(v1) as sumv1 from games group by game) t3 on t1.game=t3.game
我必须select来自以下table(它的简化版本)的一些数据:
game player v1 v2
1 p1 2 3
1 p1 1 2
1 p2 5 3
1 p3 6 7
1 p3 2 1
2 p4 4 6
2 p2 2 1
2 p3 3 4
3 p1 4 9
3 p3 5 3
...
n p3 3 4
n p2 4 9
n p3 5 3
当玩家 p1 参与游戏时(就像在游戏 1 和游戏 3 中发生的那样),我想 select 玩家 p1 的所有 v2 观察值的总和,按游戏计算。 当玩家 p1 不参加游戏时(如游戏 2 和游戏 n),我想 select 所有玩家的所有 v1 观察值的总和,按游戏计算。我想要所有游戏的所有玩家的信息,即使他们没有参加特定游戏。
这是我想要找到的最终结果:
game player v
1 p1 5 (v2: 3+2)
1 p2 3 (v2: 3)
1 p3 8 (v2: 7+1)
1 p4 16 (v1: 2+1+5+6+2)
2 p1 9 (v1: 4+2+3)
2 p2 1 (v2: 1)
2 p3 4 (v2: 4)
2 p4 6 (v2: 6)
3 p1 9 (v2: 9)
3 p2 9 (v1: 4+5)
3 p3 3 (v2: 3)
3 p4 9 (v1: 4+5)
...
n p1 12 (v1: 3+4+5)
n p2 9 (v2: 9)
n p3 3 (v2: 3)
n p4 12 (v1: 3+4+5)
非常感谢您的帮助。非常感谢。
由于 2 个摘要使用不同的分组依据条件,我只能考虑在游戏和玩家的笛卡尔积上留下的 2 个子查询中生成总和。
我假设你有一个球员主数据 table 以及列出所有球员。在下面的示例中,我将其称为 players
。我将您上面的 table 称为 games
。
select
t1.game,
p.player,
case
when t2.player is null then t3.sumv1
else t2.sumv2
end as v
from (select distinct game from games) t1
inner join players p --note the lack of join condition, I'm creating a Cartesian join
left join (select game, player, sum(v2) as sumv2 from games group by game, player) t2 on t1.game=t2.game and p.player=t2.player
left join (select game, sum(v1) as sumv1 from games group by game) t3 on t1.game=t3.game