我有射击游戏,用户在一周内相互竞争以积累最多积分。我想写一个聚合来自镜头表的统计数据的查询。这里关注的表格和关系是:
在镜头表格中,我有以下字段可供使用:
对于每个用户,我想返回一个包含以下聚合统计数据的结果集:
我已经在这个查询上工作了几个小时,但没有取得多大进展。统计功能让我兴奋不已。一位朋友建议我尝试在名为shot_records的新虚拟表中返回结果。
答案 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))
。