0

SQLの知識を超えてデータベースを正規化したと思います。:)これが私のスヌーカーリーグのウェブアプリから苦労しているクエリです。これは、すべてのシーズンのチームのハイブレイクの全体的な統計を計算します。サンプルのチームID3では。

max(break_score)maxBreak、avg(break_score)avgBreak、を選択します
   count(break_score)breaks
休憩から
match_id=break_matchで試合に参加する
ここでbreak_playerin(
個別のplayer_idを選択します
プレイヤーから
player=player_idおよびteam=3でteam_membersに参加します)
および(match_hometeam=3またはmatch_awayteam=3)

テーブル:

  • 一致:
match_id int(11)auto_increment
match_hometeam int(11)
match_awayteam int(11)
match_date 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)auto_increment
break_match int(11)match_idへの外部キー
break_player int(11)
break_score tinyint(4)
break_clearance tinyint(4)
break_year int(11)
  • team_members:多対多のテーブル。
team int(11)チームテーブルへの外部キー
player int(11)プレーヤーテーブルへの外部キー
year int(11)プレーヤーがチームでプレイした年

上記のクエリは、1つの問題を除けば、ほぼ意図したとおりに機能します。プレーヤーが複数のチームでプレーした場合、すべてのチームで彼が持っている休憩がこれらの統計に含まれます。

Breaksテーブルに追加のフィールド「break_team」がある場合、クエリは簡単です。だから私の質問は2つあります、誰かが正しいクエリを支援できますか、それともこれらの統計を支援するために正規化を少し減らす必要がありますか?非正規化する時期はいつですか?

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 に答える