0

我想我已经规范了我的数据库超出了我的 SQL 知识。:) 这是我在斯诺克联赛网络应用程序中遇到的一个问题。它计算了一支球队所有赛季的高休息时间的总体统计数据。在示例中,团队 ID 为 3。

选择 max(break_score) maxBreak,avg(break_score) avgBreak,
   计数(break_score)休息
从休息
在 match_id=break_match 上加入比赛
其中break_player在(
选择不同的 player_id
来自玩家
在 player=player_id 和 team=3 上加入 team_members)
和(match_hometeam=3 或 match_awayteam=3)

表:

  • 火柴 :
match_id int(11) 自动增量
match_hometeam int(11)
match_awayteam int(11)
match_date 日期
match_void tinyint(4)
match_status tinyint(4)
match_homescore tinyint(4)
match_awayscore tinyint(4)
match_league int(11)
  • 休息:
break_id int(11) 自动增量
break_match int(11) match_id 的外键
break_player int(11)
break_score tinyint(4)
break_clearance tinyint(4)
break_year int(11)
  • team_members :多对多表。
团队 int(11) 团队表的外键
player int(11) 玩家表的外键
year int(11) 球员为球队效力的年份

除了一个问题之外,上面的查询几乎可以按预期工作。如果一名球员为多支球队效力,那么他为所有球队所拥有的休息时间将包含在这些统计数据中。

如果 Breaks 表有一个额外的字段“break_team”,则查询将是微不足道的。所以我的问题是双重的,任何人都可以协助进行正确的查询,还是我应该稍微减少标准化以帮助这些统计数据?什么时候去规范化?

4

1 回答 1

2

我没有现成的 MySQL 安装,但你所追求的可能是 EXISTS 子句,试试这个并回复它是否满足你的需要:

select max(break_score) maxBreak, avg(break_score) avgBreak, count(break_score) breaks
from breaks
join matches on match_id=break_match
where exists(select 1
from players
join team_members on player=player_id and team=3
where break_year = year
and break_player = player_id
and (match_hometeam=3 or match_awayteam=3))
于 2009-08-22T17:18:51.830 回答