1

次のクエリを1つだけ作成しようとしていますが、その方法が見つかりません(ハードコードされた日付は現在、祖父母の列に依存しているため、mysqlはそれを認めません。それのためだけに一時テーブルを作成するのではなく、1つのクエリでそれを実行しようとしています。

select sum(result) 
from 
(
    SELECT 
      round(SUM(sr3.F_RESULT)/count(distinct(sr3.f_subgame_id))) as result,
      sr3.f_team_id
    FROM t_subgames_results sr3
    JOIN t_subgames s3 on s3.f_subgame_id = sr3.f_subgame_id
    JOIN t_seasons_games sg3 on sg3.f_game_id = s3.f_game_id
    WHERE sg3.f_date < '2012-09-14'
      and sr3.f_result>-1
    GROUP BY sr3.f_player_id
) averageByPlayer
group by f_team_id;

ご覧のとおり、チームごとのゲームごとの平均結果を取得する必要がありますが、チームごとの合計の前に、各プレーヤーで平均を計算(および切り上げ)する必要があります。

クエリを1つだけにする方法はありますか?

4

1 に答える 1

1

サブクエリまたは 2 つの完全に異なるテーブルがなければ、やりたいことを実行する方法はありません。それぞれSELECTがグループの 2 つのネストされたレベルではなく、グループの 1 つのセットにのみ集約できます。

ただし、一時テーブルの使用を回避する方法がある場合があります。EXPLAIN実行計画、そのクエリが実際にどのように実行されるかが表示される場合があります。そこに一時テーブルについて言及されていない場合、MySQL エンジンは既にそれを最適化しています。それ以外の場合は、クエリを少し変更すると役立つ場合があります。f_team_idたとえば、インナーGROUP BYに、できれば beforeを含めることができますf_player_id

それがうまくいかない場合は、SQL Fiddleでサンプル データを提供して、ユーザーが一時テーブルを使用しない式を見つけようとして実験できるようにすることをお勧めします。最適化ではテーブルの行数が考慮される場合があるため、現実的な量のデータを含めるようにしてください。

于 2012-09-20T14:41:09.233 に答える