3


私は次の表を持っています。

データベーステーブル

与えられたテーブルからすべてのプレーヤー統計レコードをフェッチしたいのですが、個々のプレーヤーのレコードには含まれています。

  1. プレーヤの名前
  2. ポジション
  3. プレイしたゲームの総数
  4. 得点されたゴールの数
  5. 目標に対するアシストの総数。
  6. 合計ポイント(合計ゴール+合計アシスト=合計ポイント)。

試した後、私はこのクエリを思いついた

SELECT SQL_CALC_FOUND_ROWS
    CONCAT(u.first_name, ' ', u.last_name) as player_name,
    p.position, 
    COUNT(g.id)
FROM 
    gce_player p 
LEFT JOIN 
    gce_user u ON(u.id = p.user_id) 
LEFT JOIN 
    gce_game_team_lineup gtl ON(gtl.player_id = p.id) 
LEFT JOIN 
    gce_game_team gt ON(gt.id = gtl.game_team_id) 
LEFT JOIN 
    gce_game_goal gg ON(gg.player_id = p.id) 
LEFT JOIN 
    gce_game g ON(g.id = gt.game_id) 
GROUP BY p.id 
ORDER BY p.id asc

上記のクエリは、プレイされたゲームの総数まで適切なレコードを返します。この後、適切なレコードを取得する際に問題が発生します。これに関するあらゆる種類のヘルプに感謝します。

スキーマを見たい場合は、ここにsqlfiddleへのリンクがあります。テストデータもいくつか追加しました。

ありがとうございました。

アップデート :

ここに覚えておくべきいくつかのルールがあります。

  1. 得点されたゴールの数=プレーヤーによって得点されたゴールの総数。たとえば、gce_game_goalテーブルにその値を持つ10行がある場合player_id as 4、プレーヤーは10ゴールを獲得したことを意味し、個々のプレーヤーのこのレコードをフェッチする必要があります。同様に、player_idの値が3である7行がある場合、これはプレーヤーを意味します。 ID3で7ゴールと同様に得点しました。

  2. ゴールのアシストの総数=プレーヤーがゴールキーパーに与えたアシストの総数(アシストはサッカーのパスのようなものです)。ユーザーが行ったアシストまたはパスの総数を計算する必要があります。
    ゴールごとに2つのアシストがあり、各アシストはボールをゴライに渡すプレーヤーです。プレイヤーからのパスやアシストの回数を数えたい。たとえば、gce_game_goal テーブルにassis1_id列またはassist2_id列のいずれかに値が3の行またはレコードが8つある場合、これはID3のプレーヤーが合計8アシストを獲得したことを意味します。

それでも疑問や質問がある場合はお知らせください。私の質問を改善してみてください。

ありがとう

4

2 に答える 2

1

これを試して

SELECT 
    CONCAT(u.first_name, ' ', u.last_name) as player_name,
    count(g.id) as Goals,
    (select 
            count(*)
        from
            gce_game_goal
        where
            assist1_id = p.player_id) 
    +(select 
            count(*)
        from
            gce_game_goal
        where
            assist2_id = p.player_id) as Assists,
     count(g.id) 
     + (select 
            count(*)
        from
            gce_game_goal
        where
            assist1_id = p.player_id) 
     + (select 
            count(*)
        from
            gce_game_goal
        where
            assist2_id = p.player_id) as Total
FROM
    gce_player as p
LEFT JOIN
    gce_game_goal as g ON p.id = g.player_id
LEFT JOIN 
    gce_user u ON(u.id =p.user_id)
GROUP BY p.player_id
于 2013-01-16T14:23:50.407 に答える
1

あなたが直面している問題は、データの複数の異なる次元に沿って(たとえばゲームごとや目標ごとに)集約することによって引き起こされます。これにより、各プレーヤーの外積が得られます。

かなり一般的な解決策はfrom、各ディメンションに沿って句で集計を行うことです。各変数(またはおそらくいくつかの変数)は、異なる集計から取得されます。

select u.last_name, u.first_name, p.position, 
       pg.goals, pg.assists, (pg.goals + pg.assists) as TotalPoints
from gce_player p join
     gce_user u
     on p.user_id = u.id left outer join
     (select player_id, SUM(goal) as goals, SUM(assist) as assists
      from ((select player_id, 1 as goal, 0 as assist
             from gce_game_goal
            ) union all
            (select assist1_id, 0 as goal, 1 as assist
             from gce_game_goal
            ) union all
            (select assist2_id, 0 as goal, 1 as assist
             from gce_game_goal
            )
           ) t
      group by player_id
     ) pg
     on pg.player_id = p.id left outer join
     (select gtl.player_id, count(*) as NumTeams
      from gce_game_team_lineup gtl join
           gce_game_team gt
           on gtl.id = gt.team_id
     ) g
     on g.player_id = p.id
于 2013-01-16T14:37:15.697 に答える