如何将两列合并为一个具有最高ID的列?

时间:2017-05-15 18:56:55

标签: mysql sql

我经营一个Carrom俱乐部,我为每场比赛配对两名球员,然后将比赛结果记录在GamesTable。玩家的ID可以显示在Player1ID列或Player2ID列中,具体取决于谁赢得折腾。 GamesTable表如下所示:

| GameID | Player1ID | Player2ID | Player1RatingAfterGame | Player2RatingAfterGame |
|--------|-----------|-----------|------------------------|------------------------|
| 5579   | 33        | 166       | 1020                   | 980                    |
| 5580   | 155       | 67        | 980                    | 1020                   |
| 5581   | 66        | 57        | 980                    | 1020                   |
| 5582   | 29        | 160       | 1020                   | 980                    |
| 5583   | 167       | 166       | 1019                   | 961                    |
| 5584   | 167       | 29        | 1004                   | 1035                   |
| 5585   | 67        | 155       | 1033                   | 962                    |

我正在尝试运行一个查询来生成一个排行榜,其中玩家的评分来自他的最新游戏'被采取。高评分的玩家获得排行榜的顶峰。 ('最新游戏'由GameID定义。最近的游戏有更高的GameID。)

我的目标是获得这样的输出:

| Rank | PlayerID | PlayerLatestRating |
|------|----------|--------------------|
| 1    | 67       | 1033               |
| 2    | 33       | 1020               |
| 3    | 66       | 980                |
| 4    | 155      | 962                |
| 5    | 166      | 961                |

如果playerID位于单个列中,则运行查询会更容易。但在我的情况下,playerID出现在两列中。如何将它们归入一个列并获得最新评级?

提前致谢。

3 个答案:

答案 0 :(得分:2)

您可以使用-v将两个玩家分成一组列,并使用相关查询过滤最新游戏。

UNION ALL

Demo

答案 1 :(得分:0)

尝试使用RENAME和UNION子句合并

rename = function(string){
  tmp = strsplit(string, " ")

  if(length(tmp[[1]]) > 2){
    return(toupper(paste(unlist(lapply(tmp, substring, 1, 1)),collapse = "")))
  }else{
    return(paste(unlist(tmp), collapse = " "))
  }
}

> rename("Oral Language Ability of Minors")
[1] "OLAOM"

> rename("Oral Language")
[1] "Oral Language"

SQL Fiddle Demo

答案 2 :(得分:0)

您可以通过以下查询获得每位玩家的最新游戏ID:

SELECT a.pid, max(a.gid)
FROM (
    SELECT player1ID as pid, MAX(gameID) as gid
    FROM GamesTable
    GROUP BY Player1ID

    UNION 

    SELECT player2ID as pid, MAX(gameID) as gid
    FROM GamesTable
    GROUP BY Player2ID
 ) a;

获得这些ID之后,您可以使用SELECT语句编写CASE来获取分数,具体取决于pid是该游戏中的player1还是player2,并按降序对其进行排序。 / p>