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 个进球,我需要为单个玩家获取此记录,同样如果有 7 行其中 player_id 的值为 3,这意味着玩家id 3 已经打进 7 球,同样如此。

  2. 进球助攻总数=球员给守门员的助攻总数(助攻就像足球中的传球)。我需要计算用户完成的助攻或传球总数。
    每个进球都会有两次助攻,每个助攻都是将球传给守门员的球员。我想计算球员传球或助攻的次数。例如,如果在gce_game_goal table 中有 8 行或记录在 assis1_id 或 assistant2_id 列中的值为 3,这意味着 id 为 3 的玩家总共获得了 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 回答