MYSQL - 三重内连接和 SUM

Posted

技术标签:

【中文标题】MYSQL - 三重内连接和 SUM【英文标题】:MYSQL - triple Inner Join and SUM 【发布时间】:2013-04-02 07:17:24 【问题描述】:

这是我的桌子: 邀请

id | inviteFromID | inviteToID | timestamp | joined
---------------------------------------------------
1  | 1            | 234567890  | 2013-02-02| 1
2  | 1            | 345678901  | 2013-02-02| 1

玩家:

id | FacebookID | first_name | last_name
---------------------------------------------------
1  | 123456789  | Dude       | Master
2  | 234567890  | Super      | Man
3  | 345678901  | Bat        | Man  

回合:

id | PlayerID | round | played | status
---------------------------------------------------
1  | 1        | 1      | 1     | 1
2  | 1        | 2      | 1     | 0
3  | 2        | 1      | 1     | 1

在这种情况下: ID = 1 的玩家将拥有 1 个自己的积分,ID = 2 的玩家将拥有 1 个自己的积分。 但是 ID 1 邀请了 2 所以 ID = 1 总共有两个点(解释如下)。

关系: - player.id = 邀请.inviteFromID - player.id = rounds.playerID

说明: 来自“玩家”表的用户可以邀请 ppl 参加游戏。比赛分轮进行。 当用户玩游戏时,“回合”表会更新为“played = 1”和 userId 和“status = 1(如果赢了)或 status = 0(如果没有赢)”。

为每个用户获得积分不是问题。

问题: ..问题是,每个被邀请的用户也会给邀请者他的积分。

所以如果用户 A(赢得 2 局 = 2 分)邀请 B,并且 B 玩了 3 局并赢得 3 局( = 3 分),那么用户 A 的总分是 5(来自 A 的积分 + 来自 B 的积分) . 对于所有被邀请到游戏中的用户 A 都是如此,所以如果用户 A 邀请了 B、C 和 D,他也将获得他们的积分。

我在这里卡住了。我尝试Inner Join玩家、邀请和回合,但没有成功,我现在卡住了。

最好的输出是

PlayerID | ownPoints | otherPoints | totalPoints
---------------------------------------------------
1        | 1         | 1           | 2
2        | 1         | 0           | 1

有人可以帮帮我吗? :)

编辑:功能 - getPointsFromPlayer(已弃用:“积分”不再可用)

SELECT 
    p.points AS OwnPoints, count(p.id) AS UsersCount, SUM(pi.points) AS SumPoints 
FROM 
    player AS p 
INNER JOIN invites AS i ON p.id = i.inviteFromID 
INNER JOIN player AS pi ON i.inviteToId  = pi.facebookID
WHERE 
    p.id = :inviter AND i.joined = 1 
GROUP BY 
    p.id

【问题讨论】:

让我编辑一下,对不起! 需要更新数据库的查询 还没有。我现在正在编写后端功能。 【参考方案1】:

解决了,和我想的一样简单:

        SELECT 
            SUM(CASE WHEN r.status = 1 THEN 1 ELSE 0 END) AS won_rounds
            FROM invites i
            INNER JOIN rounds r ON  i.inviteToID = r.facebookID
            WHERE r.played = 1 AND i.joined = 1 AND i.inviteFromID = :facebookID  

不过还是谢谢大家!

【讨论】:

以上是关于MYSQL - 三重内连接和 SUM的主要内容,如果未能解决你的问题,请参考以下文章

更快的相当于 mysql 内连接与 sum

MySQL管理和查询数据:连接查询基础

MySQL管理和查询数据:连接查询基础

MySQL管理和查询数据:连接查询基础

MySQL管理和查询数据:连接查询基础

Oracle 内连接和外连接有效组合