【发布时间】:2011-08-12 14:03:26
【问题描述】:
首先我将解释这个案例,我有一个表tbl_game,它的结构就是这样。此表包含游戏开始时间和配对玩游戏的时间
| id | time | pair_id |
-----------+--------------+ ---------------
1 | 123123123 | 1 |
2 | 123168877 | 1 |
我还有另一张桌子tbl_throws,它保存着每个玩家的得分。如果您想知道,this a basic dice rolling game
| id | game_id | player_id | score |
-----------+--------------+---------------+---------|
| 1 | 1 | 1 | 2 |
| 2 | 1 | 2 | 5 |
| 3 | 1 | 1 | 9 |
| 4 | 1 | 2 | 11 |
| 5 | 2 | 1 | 7 |
| 6 | 2 | 2 | 6 |
现在,id 这里是投掷 id,而不是游戏 id。在这里,每个拥有player_id 1 和 2 的玩家都掷了两次骰子,并在同一场比赛中得到了各自的分数,而在另一场比赛中只有一次
现在,使用这两个表,我需要创建一个记录集,即每个玩家在一场比赛中的总得分
| game_id | game_time | player1_total | player2_total|
|------------+-----------+---------------+--------------|
| 1 | 123123123 | 11 | 16 |
| 2 | 123168877 | 7 | 6 |
我尝试了很多莫名其妙的巨型查询,但没有给出正确的结果? 对此的正确查询是什么?
更新
因为,大多数答案都受到一个事实的限制,即 player1id 和 player2id 必须是已知的或固定的。
因此,我即将提供的信息可能有助于消除混淆。
还有另一个表,其中保存了玩家的信息。 tbl_pupil
结构如下
| id | unique_id | name |
|---------+---------------+----------|
| 1 | 001 | some |
| 2 | 002 | another |
而这些玩家统称为另一桌的一对tbl_pair
| id | player1 | player2 |
|---------+---------------+----------|
| 1 | 1 | 2 |
So, now
select
g.id
g.time
p1.id as player1id
p1.name as player1name
t.score as player1score
p2.id as player2id
p2.name as player2name
t.score as player2score
FROM
tbl_game g,
inner join tbl_pair as pair on g.pair_id = pair.id
inner join tbl_pupil as p1 on p1.id = pair.player1
inner join tbl_pupil as p2 on p2.id = pair.player2
inner join tbl_throw as t on g.id = t.game_id
这是我的初步查询,它以这样的方式带来了记录集
| id | time | player1id | player1name | player1score | player2id | player2name | player2score |
----------------------------------------------------------------------------------------------------------------------------
| 1 | 12 | 1 | some | 5 | 2 | another | 2 |
| 1 | 12 | 1 | some | 5 | 2 | another | 5 |
| 1 | 12 | 1 | some | 9 | 2 | another | 9 |
| 1 | 12 | 1 | some | 11 | 2 | another | 11 |
现在我只是顺便显示一个游戏 id 的结果。我没有保存足够的知识,将上述记录归为一个,其中 player1 单独的总分在一列中,而 playe2 的单独总分总和在另一列中。
【问题讨论】:
-
您使用的是什么类型的数据库? MSSQL、MySQL?
-
@Jon - 他在评论中添加了 SQL Server,我添加了标签。
-
解决问题的一种方法:首先,获取每个玩家在每场比赛中的总分。然后,将该结果集加入自身,以获得同一行中两个玩家的分数。我发布的答案有一个这种方法的例子。
标签: sql sql-server pivot-table