2011-02-12 18 views
1

私は特別なクエリをどのように構造化するかについて困惑していました。私が知ることができる最良のものは、何らかの複雑なサブクエリシステムでなければならないということです。MySQLは3つのテーブルと平均を結合する

私は完全にはわかりませんが、

私は3つのテーブルteams,matchesおよびscoredを持っています。

teamsテーブルには、チーム番号と対応するチーム名のリストが含まれています。

matchesテーブルには、マッチ結果(チームごとに1つの行につき1つの行)が記録され、対応するチーム番号が含まれています。

scoredテーブルには、チームが行った各得点に関する情報と、対応する一致結果IDのリストが含まれています。 teamnumber考える

┌────────────┐ 
| TEAMS  | 
├────────────┤ 
│ teamnumber | 
│ teamname | 
└────────────┘ 

┌───────────────┐ 
| MATCHES  | 
├───────────────┤ 
│ teamnumber | 
│ matchresultid | 
└───────────────┘ 

┌───────────────┐ 
| SCORED  | 
├───────────────┤ 
│ matchscoredid | 
│ matchresultid | 
└───────────────┘ 

、私はmatchresultidあたりscoredで平均行数を取得する必要があります。どうすればいい?試合ごとに各チームの得点数を返す必要があります

SELECT s.matchresultid, count(*) 
FROM scored s 
JOIN matches m 
ON m.matchresultid = s.matchresultid 
WHERE m.teamnumber = your_team_number 
GROUP BY s.matchresultid 
+0

は、より多くの私は、私はなってこのより混乱して見て...平均ためのIFNULL()とLEFTが参加するに変更、および終了です。 matchresultidあたりの平均行数はどういう意味ですか? matchresultidごとに得点する行は1つだけです。 1つの数字の平均はどうですか? –

答えて

3

で「カウント」を交換する必要があり、私はあなたが混乱して他の人を持っているかもしれない取り残さ一つの要素は、与えられたチームだったゲームの実際のスコアだと思います逆転する。だから、基本的には、1つのチームにしたい、と季節のコースを、あなたは彼らが得点平均#ポイントが欲しい...

select 
     t.teamnumber, 
     t.teamname, 
     avg(s.totalpoints) TeamAvgPoints 
    from 
     teams t 
     join matches m 
      on t.teamnumber = m.teamnumber 
      join scored s 
       on m.matchresultid = s.matchresultid 
    where 
     t.teamnumber = SomeValue 

あなたはすべてのチームの平均値の比較をしたい場合は、WHERE句を無視してください...

group by 
     t.teamnumber, 
     t.teamname 

でグループを採点表は、試合ごとに複数の行を持って、その後、事前集計は平均を得るTHEN、最初の合計ポイントを持っているゲームごとに行われる必要がある場合は...のようなものを

select 
     PreQuery.TeamNumber, 
     PreQuery.TeamName, 
     avg(ifnull(PreQuery.MatchTotalPoints, 0)) AvgPerGame 
    from 
     (select 
      t.teamnumber, 
      t.teamname, 
      m.matchresultid, 
      count(*) MatchTotalPoints 
     from 
      teams t 
       left join matches m 
        on t.teamnumber = m.teamnumber 
        left join scored s 
        on m.matchresultid = s.matchresultid 
     where 
      t.teamnumber IN(SomeValue, AnotherValue, MoreValues, EtcValue) 
     group by 
      t.teamnumber, 
      t.teamname, 
      m.matchresultid) PreQuery 
    group by 
     PreQuery.TeamNumber, 
     PreQuery.TeamName 

このバージョンのクエリでは、すべてのチームを比較する場合は、特定のチームの内部WHERE句を削除し、teamnumberとteamnameによってOUTERクエリにグループを適用します。

が全体のリストについては、余分な修飾子を取得するには、私は

+0

この回答は最も近いですが、チームがゲームをプレイしていない場合、結果の列はすべてNULLです。 – skeggse

+0

@CMC、私はLEFT JOINsに変更しましたので、まだチームを獲得しますが、ポイントの数はnullになります。それで、外の部分では、IFNULL()を使ってゼロを使用しました...試してみてください – DRapp

+0

優秀、ありがとう! – skeggse

0

はこれを試してみてください。

0
SELECT a.teamname team, b.matchresultid match, COUNT(c.matchscoredid) scores 
FROM teams a, matches b, scored c 
WHERE a.teamnumber = b.teamnumber AND b.matchresultid = c.matchresultid; 

1

スコアの数やスコアの平均が必要ですか?あなたはスコアの平均が必要な場合は、「平均」

SELECT s.matchresultid, COUNT(s.matchscoredid) 
    FROM matches m INNER JOIN scored s ON m.matchresultid = s.matchresultid 
WHERE m.teamnumber = <team> 
GROUP BY s.matchresultid 
関連する問題