【问题标题】:Creating views using multiple rows of data to make comparative selections使用多行数据创建视图以进行比较选择
【发布时间】:2017-01-28 01:18:37
【问题描述】:

我有一个数据库,其中记录了 7 场足球比赛的球队和得分。 球队每周更换一次,但每次一名球员在获胜球队中时,他们都会获得 3 分(1 分表示平局,0 分表示负队)。

我希望能够选择一个 ID 为 21 的玩家,列出他参加过的游戏,然后给出与其他玩家一起玩过的总点数和游戏数。

在过去的几个小时里,我一直在创建查询来评估这个问题,但似乎无法破解它。我的流程如下:

1) 列出玩家 21 参加过的所有游戏

2) 列出在玩家 21 玩过的游戏中玩过的所有玩家 ID。

3) 对于上面列出的每个玩家 ID,当他们出现在玩家 21 参加过的任何游戏中时,将列出的玩家 ID 的总分求和并计算他们出现的次数。

1) 列出玩家 21 玩过的所有游戏

    mysql> SELECT Game, GameDate, Team, PlayerID FROM Teams WHERE PlayerID='21';
    +------+------------+------+----------+
    | Game | GameDate   | Team | PlayerID |
    +------+------------+------+----------+
    | A    | 2017-01-10 | A    |       21 |
    | A    | 2017-01-17 | A    |       21 |
    | A    | 2017-01-24 | A    |       21 |
    | B    | 2017-01-10 | A    |       21 |
    | B    | 2017-01-17 | A    |       21 |
    | B    | 2017-01-24 | A    |       21 |
    | C    | 2017-01-10 | A    |       21 |
    | C    | 2017-01-17 | A    |       21 |
    +------+------------+------+----------+
    8 rows in set (0.00 sec)

2) 列出所有在玩家 21 玩过的游戏中玩过的玩家 ID。

如果我尝试在没有 LIMIT 1 OFFSET 0 的情况下运行此查询,则会收到 more than one row selected 错误。

mysql> 
SELECT PlayerID, Game, GameDate, Team 
FROM Teams 
WHERE Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 0) 
AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 0) 
AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 0);
        +----------+------+------------+------+
        | PlayerID | Game | GameDate   | Team |
        +----------+------+------------+------+
        |        5 | A    | 2017-01-10 | A    |
        |        8 | A    | 2017-01-10 | A    |
        |       11 | A    | 2017-01-10 | A    |
        |       12 | A    | 2017-01-10 | A    |
        |       14 | A    | 2017-01-10 | A    |
        |       15 | A    | 2017-01-10 | A    |
        |       21 | A    | 2017-01-10 | A    |
        +----------+------+------------+------+
        7 rows in set (0.00 sec)

这列出了在第一场比赛/第一行中玩过的所有玩家,玩家 21。

是否有某种形式的 loop 我可以将此查询放入递增 OFFSET @X 以便我可以将所有这些游戏和玩家 ID 列在一个表中?

这是我尝试过的:

SET @GameNumber = (SELECT Count(*) FROM Teams WHERE PlayerID='21');
SET @GameCount = 0;
SELECT PlayerID, Game, GameDate, Team 
FROM Teams            
    WHILE(@GameNumber < @GameCount) DO
        WHERE Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET @GameNumber) 
        AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET @GameNumber) 
        AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET @GameNumber);
    SET @GameNumber = @GameNumer+1;
    END WHILE;

编辑 1


我已经达到了这样一个程度,我至少可以知道其他玩家与玩家 21 玩过多少场比赛。

SELECT Players.PlayerID, COUNT(*) AS Games 
FROM Teams, Players

WHERE 
Teams.PlayerID=Players.PlayerID
AND
(
        (
        Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 0) 
        AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 0) 
        AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 0)
        )
        or
        (
        Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 1) 
        AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 1) 
        AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 1)
        )
        or
        (
        Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 2) 
        AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 2) 
        AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 2)
        )
        or
        (
        Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 3) 
        AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 3) 
        AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 3)
        )
        or
        (
        Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 4) 
        AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 4) 
        AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 4)
        )
        or
        (
        Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 5) 
        AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 5) 
        AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 5)
        )
        or
        (
        Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 6) 
        AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 6) 
        AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 6)
        )
        or
        (
        Game=(SELECT Game FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 7) 
        AND GameDate=(SELECT GameDate FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 7) 
        AND Team=(SELECT Team FROM Teams WHERE PlayerID='21' LIMIT 1 OFFSET 7)
        )
)
GROUP BY Teams.PlayerID
ORDER BY Games DESC
;

上面给你这个表:

+----------+-------+
| PlayerID | Games |
+----------+-------+
|       15 |     8 |
|       21 |     8 |
|        8 |     8 |
|       14 |     6 |
|        5 |     6 |
|       19 |     5 |
|       11 |     5 |
|       10 |     3 |
|       12 |     3 |
|        4 |     2 |
+----------+-------+
10 rows in set (0.01 sec)

【问题讨论】:

    标签: mysql


    【解决方案1】:

    小伙伴们,说说我是初学者吧。我只是在查看subquery returns more than 1 row 错误,我遇到了ANY。一个 3 个字母的单词,让我的生活更轻松。

    SET @IDNumber := 21;
    SELECT Players.PlayerID, Players.Name, COUNT(Games.Points) AS Games_Played, SUM(Games.Points) AS Points, SUM(Points/Games_Played) AS Points_Per_Game
    FROM Teams, Players, Games
    
    WHERE 
    Teams.PlayerID=Players.PlayerID
    AND
    Games.Game=Teams.Game
    AND
    Games.Team=Teams.Team
    AND
    Games.GameDate=Teams.GameDate
    AND
    (
    CONCAT(Games.Game, '_', Games.Team, '_', Games.GameDate)= ANY(SELECT CONCAT(Teams.Game, '_', Teams.Team, '_', Teams.GameDate) FROM Teams WHERE PlayerID=@IDNumber)
    )
    
    GROUP BY Teams.PlayerID
    ORDER By Points_per_Game DESC, Points DESC, Games_Played
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多