【发布时间】: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