3

次のテーブルがあります。

Players
- id
- name

Games
- id
- game_type_id
- season_id


Goals
- player_id
- game_id

Assists
- player_id
- game_id

私は、シーズンとゲームの種類ごとにプレーヤーの目標とアシスト数を得るクエリ/ビューを作成しようと苦労しています。ゴール/アシストの有無にかかわらず、各シーズンとゲームの種類ごとに各プレーヤーがリストされていることが重要です。

クエリは、ビューを作成するために使用されます。1回のクエリで実行できますか?

更新: これは、いくつかの実稼働サンプル データを含むSQL Fiddleです。

4

4 に答える 4

3

更新しました

SELECT
    players.id,
    players.name,
    games.season_id,
    games.game_type_id,
    sum(CASE WHEN g.goals IS NULL THEN 0 ELSE g.goals END) AS goals,
    sum(CASE WHEN a.assists IS NULL THEN 0 ELSE a.assists END) AS assists
FROM players
CROSS JOIN games
LEFT JOIN (
  SELECT
    game_id, player_id,
    count(*) AS goals
  FROM goals
  GROUP BY
    game_id, player_id
) g ON
    g.player_id = players.id
    AND g.game_id = games.id
LEFT JOIN (
  SELECT
    game_id, player_id,
    count(*) AS assists
  FROM assists
  GROUP BY
    game_id, player_id
) a ON
    a.player_id = players.id
    AND a.game_id = games.id
GROUP BY
    players.id,
    players.name,
    games.season_id,
    games.game_type_id

これは非常に短いバージョンではありませんが、すぐに表示されるはずです。

于 2012-09-14T16:57:32.933 に答える
3
SELECT
  players.id,
  players.name,
  games.season_id,
  games.game_type_id,
  SUM(COALESCE(assists.rows, 0))             AS assists,
  SUM(COALESCE(goals.rows,   0))             AS goals
FROM
  players
CROSS JOIN
  games
LEFT JOIN
  (SELECT game_id, player_id, COUNT(*) AS rows FROM assists GROUP BY game_id, player_id) AS assists
    ON assists.game_id = games.game_id
LEFT JOIN
  (SELECT game_id, player_id, COUNT(*) AS rows FROM goals   GROUP BY game_id, player_id) AS assists
    ON goals.game_id   = games.game_id
GROUP BY
  players.id,
  players.name,
  games.season_id,
  games.game_type_id

Seasonsただし、テーブルとテーブルがあれば、パフォーマンスが向上する可能性がありGameTypeます。

SELECT
  players.id,
  players.name,
  seasons.id,
  game_types.id,
  SUM(COALESCE(assists.rows, 0))             AS assists,
  SUM(COALESCE(goals.rows,   0))             AS goals
FROM
  players
CROSS JOIN
  seasons
CROSS JOIN
  game_types
LEFT JOIN
  games
    ON  games.season_id = seasons.id
    AND games.game_type = game_types.id
LEFT JOIN
  (SELECT game_id, player_id, COUNT(*) AS rows FROM assists GROUP BY game_id, player_id) AS assists
    ON assists.game_id = games.game_id
LEFT JOIN
  (SELECT game_id, player_id, COUNT(*) AS rows FROM goals   GROUP BY game_id, player_id) AS assists
    ON goals.game_id   = games.game_id
GROUP BY
  players.id,
  players.name,
  seasons.id,
  game_types.id
于 2012-09-14T16:37:35.173 に答える
1

これを試して:

select p.id,
  p.name,
  gm.season_id,
  gm.game_type_id,
  sum(gl.goalcount),
  sum(a.AssistCount)
from players p
left join
(
  select game_id, player_id, count(*) GoalCount
  from goals
  group by game_id, player_id
) gl
  on p.id = gl.player_id
left join
(
  select game_id, player_id, count(*) AssistCount
  from assists
  group by game_id, player_id
) a
  on p.id = a.player_id
left join games gm
  on gl.game_id = gm.id
  and a.game_id = gm.id
where season_id is not null
group by p.id,
  p.name,
  gm.season_id,
  gm.game_type_id

SQL Fiddle with Demoを参照してください

于 2012-09-14T19:51:50.990 に答える
0

素晴らしい、私はクロスジョインについて考えていませんでした、私は思いついた:

プレーヤーからplayers.id、games.game_type_id、games.season_id、gc、acを選択します

左結合(count(id)をc、player_id、game_idとして、player_id、game_idによるゴールグループから選択)g.player_id=players.idでgとして

左結合(count(id)をc、player_id、game_idとして、player_id、game_idによるアシストグループから選択)をa.player_id=players.idとして選択します。

games.id=g.game_idおよびgames.id=a.game_idグループ(players.id、games.game_type_id、games.season_id)でゲームに正しく参加します。

于 2012-09-14T18:07:57.670 に答える