【发布时间】:2014-09-09 15:15:37
【问题描述】:
情况:
比赛有 10 名球员,每队 5 名。总共有 100 名球员,每场比赛可以有任何球员在十个位置中的任何一个。给定两个玩家,我需要提取以下内容:
- 玩家 A 和玩家 B 结盟了多少场比赛?
- 他们赢了多少?
- 玩家 A 和玩家 B 的对手有多少场比赛?
- 玩家 A 赢了多少?
我当前的方法(太慢,可能不起作用):
我已经制作了三个表格,“players”、“matches”和“matches_players”,它们将比赛映射到其中的球员。 matchs 中的“winning_team”列表示哪支球队获胜(0 = A 队,1 = B 队),matches_players 表中的“position”列表示球员在阵容中的哪个位置。 0-4 属于 A 队,5-9 属于 B 队。
玩家
player_id
43179582
63260623
31250276
54829050
22257854
etc...
匹配
match_id winning_team
95824317 0
06236326 0
02763125 1
90505482 0
78544325 1
etc...
matches_players
relation_id match_id player_id position
1 95824317 43179582 1
2 95824317 63260623 5
3 06236326 43179582 7
4 06236326 54829050 0
5 06236326 22257854 4
etc...
这是我用于查找同一支球队中英雄的比赛和获胜次数的语句(经过 12 多个小时的冲浪并试图理解 SQL):
SELECT
COUNT(*) AS match_count,
SUM(CASE WHEN team = winning_team THEN 1 ELSE 0 END) AS win_count
FROM
(SELECT
matches.match_id,
(CASE WHEN position < 5 THEN 0 ELSE 1 END) AS team,
winning_team
FROM matches INNER JOIN matches_players ON matches.match_id = matches_players.match_id
WHERE player_id = [____] OR player_id = [____]
GROUP BY match_id, team HAVING COUNT(*) = 2)
AS pair_matches
它似乎有效,但速度非常慢(250,000 场比赛超过 90 秒),理想情况下,我希望对方团队在同一个查询中得到结果(这应该比两个单独的查询更快,不是吗?)查询更快/更好?是否存在数据库设计缺陷?
我真的很感谢任何帮助家伙。欢迎任何领域的建议。谢谢。
【问题讨论】:
-
在一场给定的比赛中,你如何知道球员所在的球队?
-
为了速度...我会先研究索引。虽然可能是一个逻辑问题...如果您尝试按某些字段分组,但排除其他字段(获胜团队不在您的分组中),大多数数据库将返回错误。当其他数据库返回错误时,MySQL 似乎只是随机返回一个。
-
他们的球队可以通过他们在matches_players表中的“位置”找到。 0-4 的位置表示他们在 A 队,5-9 表示 B 队。第十二,match_id 和 player_id 字段被索引并具有链接表的外键。你的意思是我需要索引其他列?我会将winning_team 添加到 GROUP BY 中,看看是否有帮助。