【问题标题】:Complicated mysql select复杂的mysql选择
【发布时间】:2016-06-16 10:32:54
【问题描述】:

我必须从下表中选择一些数据(它的简化版本):

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 中发生的那样),我想按游戏选择该玩家 p1 的所有 v2 观察值的总和。 当玩家 p1 不参与游戏时(如游戏 2 和游戏 n),我想按游戏选择所有玩家的所有 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)

非常感谢您的帮助。非常感谢。

【问题讨论】:

    标签: mysql select union


    【解决方案1】:

    由于 2 个汇总使用不同的分组条件,我只能考虑在 2 个子查询中生成总和,这些子查询加入了游戏和玩家的笛卡尔积。

    我假设您还有一个列出所有玩家的玩家主数据表。在下面的示例中,我将其称为 players。我将您的上表称为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
    

    【讨论】:

    • 你能解释一下吗?什么是“t1”、“t2”和“t3”?感谢您的帮助。
    • 子查询的别名。我使用 3 个子查询作为表。我使用别名就好像它是一个表名。
    • 好的,我试过了,但它告诉我表“游戏”和“玩家”不存在。
    猜你喜欢
    • 2013-03-16
    • 2013-08-29
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2013-06-20
    相关资源
    最近更新 更多