2011-11-07 13 views
2

私はシナリオ、式1を説明します。数式1の各チームに2人のドライバー、24人のドライバー、12のチームがあります。私はteam_statsテーブルから以下のように計算されたポイントを取得する必要がありますが、driver_statsテーブルからポール、表彰台、勝利を得るので、sebastion vettelとmark webberは両方ともteam_id = '3'のメンバーです。私は、それぞれのdriver_statsテーブルから極、表彰台、勝利を得てそれらを合計する必要がありますが、team_statsテーブルからTEAMのポイントを計算してください。私が遭遇したのは、driver_statsテーブルに2つのドライバがあるので、各team_idのチームポイントを2回計算しているということです。チーム_スタットテーブル内のポイントだけをSUMにする必要があります。のメンバーです。これは動作しますが、driver_statsテーブルからポイントを算出下回っ異なるテーブル内の2つの列のMYSQL SUM

DRIVER_STATS TABLE 
| track_id | drivers_id | qual_pos | race_pos | overtakes | points 

TEAM STATS TABLE 
| track_id | team_id | points | 

DRIVERS TABLE 
| driver_id | drivername | team_id | 

TEAM TABLE COLUMNS 
|team_id | teamname | value 

さて、それは正しく一緒に2つのドライバを追加することにより、...など追い越す極のための合計を行います。代わりにteam_statsテーブル内の各team_idのポイント部分をSUMにする必要があります。そのテーブルには、driver_statsテーブルの2つのドライバ、1つのチームに2つのドライバが1つしかありません。

SELECT t.teamname, 
     t.value, 
     SUM(IF(s.qual_pos = '1', 1,0)) AS poles, 
     SUM(IF(s.race_pos <= '3', 1,0)) AS podiums, 
     SUM(IF(s.race_pos = '1', 1,0)) AS victories, 
     SUM(s.overtakes) AS overtakes, 
     SUM(CASE 
      WHEN s.track_id = (SELECT MAX(track_id) FROM driver_stats) THEN 
      points 
      ELSE 
      0 
     End) AS lastracepoints, 
     SUM(points) AS points 

    FROM   drivers d 
    INNER JOIN driver_stats s 
    ON   d.drivers_id = s.drivers_id 
    AND   d.team_id = 3 
    LEFT JOIN teams t 
    ON   d.team_id = t.team_id 
    GROUP BY 
    t.teamname 

これは私もそれを試みて達成するために変更したクエリです。

 SELECT t.teamname, 
     t.value, 
     SUM(IF(s.qual_pos = '1', 1,0)) AS poles, 
     SUM(IF(s.race_pos <= '3', 1,0)) AS podiums, 
     SUM(IF(s.race_pos = '1', 1,0)) AS victories, 
     SUM(s.overtakes) AS overtakes, 
     SUM(CASE 
      WHEN ts.track_id = (SELECT MAX(track_id) FROM team_stats) THEN 
      ts.points 
      ELSE 
      0 
     End) AS lastracepoints, 
     SUM(ts.points) AS points 

    FROM   drivers d 
    INNER JOIN driver_stats s 
    ON   d.drivers_id = s.drivers_id 
    AND   d.team_id = 3 
    LEFT JOIN teams t 
    ON   d.team_id = t.team_id 
    INNER JOIN team_stats ts 
    ON   ts.team_id = d.team_id 
    GROUP BY 
    t.teamname 

数字はちょっと、それは内の各ドライバーのために二回team_statsテーブルの合計をやっているように見える、それにteam_statsに参加してteam_statsに合計ポイントを変更することで、この1になりましコントロールの外に出ますdriver_statsテーブルここで一度実行する必要があります。

ご協力いただきまして誠にありがとうございます。

+1

あなたには、いくつかのサンプルデータ/出力を投稿できるのでしょうか? –

答えて

0

がt.team_idに参加ts.team_id、および内部結合に見てはいけない、あなたは別のLEFTとのより良いかもしれません

関連する問題