📋 表概述

log_arena_fights 表以战斗为单位记录竞技场的每一场比赛。包含比赛的胜负方、比赛时长、双方的等级分变化以及在线人数等信息,是竞技场数据分析和排名追踪的重要日志表。

📊 表结构

字段名数据类型默认值说明
fight_idint UNSIGNED(无)战斗唯一ID,关联 log_arena_memberstats
timedatetime(无)战斗发生时间
typetinyint UNSIGNED(无)竞技场类型:0=2v2, 1=3v3, 2=5v5
durationint UNSIGNED(无)战斗持续时间(秒)
winnerint UNSIGNED(无)获胜方队伍 ID
loserint UNSIGNED(无)失败方队伍 ID
winner_trsmallint UNSIGNED(无)获胜方赛前队伍等级
winner_mmrsmallint UNSIGNED(无)获胜方赛前匹配分
winner_tr_changesmallint(无)获胜方等级变化(可为负)
loser_trsmallint UNSIGNED(无)失败方赛前队伍等级
loser_mmrsmallint UNSIGNED(无)失败方赛前匹配分
loser_tr_changesmallint(无)失败方等级变化(通常为负)
currOnlineint UNSIGNED(无)本场比赛时的服务器在线人数

🔍 重要字段详解

winner_tr_change / loser_tr_change — 等级分变化

这是 Elo 等级系统/MMR 算法的核心数据。胜方通常获得正分,败方扣除分数。分数变化幅度取决于双方实力差距(弱队战胜强队会获得更多分数)。

duration — 战斗持续时间

单位为秒。可通过此字段分析竞技场平均战斗时长,检测异常快速结束或超长比赛的作弊行为。

currOnline — 在线人数

记录比赛时刻的服务器在线玩家数,用于分析不同时段竞技场活跃度与在线人数的关系。

💡 SQL查询示例

查询某队伍的最近10场比赛记录

SELECT lf.fight_id, lf.time, lf.type,
       CASE WHEN lf.winner = 123 THEN '胜' ELSE '负' END AS 结果,
       lf.duration, lf.winner_tr_change, lf.loser_tr_change
FROM log_arena_fights lf
WHERE lf.winner = 123 OR lf.loser = 123
ORDER BY lf.time DESC
LIMIT 10;

统计各类型竞技场平均战斗时长

SELECT CASE type WHEN 0 THEN '2v2' WHEN 1 THEN '3v3' WHEN 2 THEN '5v5' END AS 类型,
       COUNT(*) AS 场次, AVG(duration) AS 平均时长秒
FROM log_arena_fights
GROUP BY type;

❓ 常见问题

Q: fight_id 如何生成?

fight_id 由竞技场匹配系统在战斗开始时分配,通常是一个全局递增的整数。可以串联 log_arena_memberstats 表获取每场战斗的队员详情。

Q: winner_tr 和 winner_mmr 有什么区别?

winner_tr 是队伍显示的竞技场等级(Rating),玩家可见。winner_mmr 是匹配分(Match Making Rating),系统内部使用来匹配实力相当的对手,玩家不可见。