2013-01-16 148 views
3


我有以下表格。从数据库计算玩家统计信息

database tables

我想从给定的表中获取所有球员的统计记录,个别球员的纪录包括。

  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如果你想看看架构,我也添加了一些测试数据。

谢谢。

UPDATE:

这里有几个要记住的规则。

  1. 进球数=球员进球总进球数。例如,如果在gce_game_goal表中有10行,其中 的值为player_id as 4这意味着玩家已经获得了10个目标 ,我需要为单个玩家获取此记录,并且如果有7行,其中player_id具有值3这 意味着ID为3的球员已经打进了7球并且同样如此。

  2. 进球助攻总数=球员给守门员的助攻总数(助攻就像足球传球)。我需要 计算用户完成的助攻或传球总数。
    对于每个进球都会有两个助攻,而且每个助攻都是球员 传球给一个golaie。我想统计球员的数量 或协助。例如,如果在gce_game_goal 表有8行或具有3中任一 assis1_id或assist2_id列中的值的记录,这意味着ID为3播放机已经 拿下8协助总

请让我知道,如果你还有任何疑问/问题,生病尝试来改善我的问题

感谢

+0

究竟是什么不起作用?哪个价值,你期望什么,返回什么?有错误吗?哪些错误? – markus

+0

什么是“助攻目标总数”。 – Sahal

+0

对不起,让你困惑的人,我正在更新我的问题的所有细节,请等待几分钟,谢谢。 –

回答

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 
+0

自己查询查询不工作,我不能够发现错误,如果你愿意想要测试您的查询对测试数据这里是链接到sqlfiddle http://sqlfiddle.com/#!2/3031f/6顺便说一句,谢谢你的回应。 –

+1

@IbrahimAzharArmar。 。 。我解决了这些问题。然而,这个想法不如特定语法重要。您需要在将玩家级别*加入到一起之前计算各种统计数据。 –

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 
+0

这给了我错误,你可以尝试在http://sqlfiddle.com/#!2/3031f/6 –