2009-08-22 57 views
0

我想我已經超越了我的SQL知識規範化了我的數據庫。 :) 這是我從斯諾克聯賽網絡應用程序中掙扎的一個查詢。它會計算整個賽季所有球隊的高分數統計數據。在這個例子中團隊ID 3.規範化MySQL以外的知識?

select max(break_score) maxBreak,avg(break_score) avgBreak, 
    count(break_score) breaks 
from breaks 
join matches on match_id=break_match 
where break_player in (
select distinct player_id 
from players 
join team_members on player=player_id and team=3) 
and (match_hometeam=3 or 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) foreign key to match_id 
break_player int(11) 
break_score tinyint(4) 
break_clearance tinyint(4) 
break_year int(11)
  • team_members:多對多的表格。
team int(11) foreign key to teams table 
player int(11) foreign key to players table 
year int(11) the year that the player played for the team

上面的查詢工作幾乎從一個問題旨在開。如果一名球員爲不止一支球隊效力,那麼他爲所有球隊提供的休息時間將包含在這些數據中。

如果Breaks表中有一個額外的字段'break_team',查詢就會很平常。所以我的問題有兩方面,任何人都可以協助正確的查詢,或者我應該減少標準化來幫助這些統計數據?什麼時候去標準化?

回答

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)) 
+0

外貌就像你修復它一樣。您的查詢在最後一列收集345,這是所有單獨季節總數的總和。我的查詢返回347,來自不同賽季和球隊的幾次休息。非常感謝。 – PaulBM 2009-08-22 17:50:57

+0

沒問題,很高興它爲你解決......如果你發現任何未來的小故障回覆,我會檢查回來。 – 2009-08-22 19:13:53