Mysql 从数据库计算播放器统计信息
Mysql 从数据库计算播放器统计信息,mysql,database,Mysql,Database,我有以下表格 我想从给定的表中获取所有玩家统计记录,每个玩家的记录包括 球员姓名 位置 游戏总数 进球数 目标协助的总数 总分(总目标+总辅助=总分) 在尝试之后,我提出了这个问题 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
我有以下表格 我想从给定的表中获取所有玩家统计记录,每个玩家的记录包括
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
上面的查询返回我正确的记录,直到游戏总数,我面临的问题是在此之后获取正确的记录,我将感谢任何帮助
下面是链接,如果您想查看模式,我也添加了一些测试数据
多谢各位
更新:
这里有一些规则需要记住
gce\u game\u goal
表中有10行
player_id的值为4
表示该球员已攻入10球
我需要为每个玩家取这张唱片
同样,如果有7行中的player_id的值为3,则此
意味着id为3的球员已经攻入7球,同样每个进球都有两次助攻,每次助攻都是球员 把球传给高尔夫球手的人。我想数一数传球的次数 或由球员提供的协助。例如,如果在
gce\u游戏\u目标中
表中有8行或记录的值为3
assis1_id或assist2_id列,这意味着id为3的玩家拥有
总共得到8次助攻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
您所面临的问题是由于数据的多个不同维度(如游戏和目标)的聚合造成的。这将导致每个玩家的叉积 一个相当普遍的解决方案是在
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
到底是什么不起作用?哪个值,您期望什么,返回什么?有错误吗,哪些错误?目标协助的总数是多少。?抱歉,各位把你们搞糊涂了,我正在更新我的问题的所有细节,请稍等几分钟,谢谢。你们只是在使用数据库吗?你有没有访问像C++甚至PHP这样的服务器?我只能想象,当每个表大约有50行时,最后一个查询的速度会有多慢。如果是这样,我建议您在那里处理您的计算。它更容易、更快。虽然有更多的代码行,但您可能会花同样的时间进行类似这些工作的深奥查询。@JoeCoderGuy我正在使用PHP
我建议您在那里处理您的计算。
这是什么意思?这给了我错误,您可以自己尝试查询,因为查询不起作用,我无法识别错误,如果您想根据测试数据测试您的查询,这里是SQLFIDLE的链接,顺便说一句,谢谢您的回答。@Ibrahimazharmar。我解决了问题。然而,比特定语法更重要的是想法。在将玩家级别的各种统计数据合并到一起之前,您需要计算它们。