使用SQL聚合和计算统计信息

时间:2011-09-26 01:34:43

标签: mysql sql aggregate-functions

我有射击游戏,用户在一周内相互竞争以积累最多积分。我想写一个聚合来自镜头表的统计数据的查询。这里关注的表格和关系是:

  • 用户有很多competition_periods
  • competition_period属于用户
  • competition_period有很多镜头
  • shot属于competition_period

在镜头表格中,我有以下字段可供使用:

  • 结果 - >字符串值:WON,LOST或TIED
  • amount_won - >整数值:例如,-100,0,2000等

对于每个用户,我想返回一个包含以下聚合统计数据的结果集:

  • won_count
  • lost_count
  • tied_count
  • total_shots_count(won_count + lost_count + tied_count)
  • total_amount_won(amount_won的总和)
  • avg_amount_won_per_shot(total_amount_won / total_shots_count)

我已经在这个查询上工作了几个小时,但没有取得多大进展。统计功能让我兴奋不已。一位朋友建议我尝试在名为shot_records的新虚拟表中返回结果。

1 个答案:

答案 0 :(得分:5)

这是基本的解决方案,计算给定玩家的所有镜头的统计数据(您没有指定是否在每个竞赛时段基础上想要它们):

 SELECT user, SUM(IF(result = 'WON', 1, 0))  AS won_count, 
              SUM(IF(result = 'LOST', 1, 0)) AS lost_count, 
              SUM(IF(result = 'TIED', 1, 0)) AS tied_count, 
              COUNT(*)                       AS total_shots_count, 
              SUM(amount_won)                AS total_amount_won, 
              (SUM(amount_won) / COUNT(*))   AS avg_amount_won_per_shot 
 FROM user U INNER JOIN competition_periods C ON U.user_id = C.user_id
 INNER JOIN shots S ON C.competition_period_id = S.competition_period_id
 GROUP BY user

请注意,这包括计算“总赢额”数字时的负数(即总数减去损失)。如果这不是您游戏的正确算法,则可以在查询中出现的两个位置将SUM(Amount)更改为SUM(IF(Amount > 0, Amount, 0))